2023-05-08:我們定義了一個(gè)函數(shù) countUniqueChars(s) 來(lái)統(tǒng)計(jì)字符串 s 中的唯一字符, 并返回唯一字符的個(gè)數(shù)。 例如:s = “LEETCODE“ ,則其中 “L“, “T

2023-05-08:我們定義了一個(gè)函數(shù) countUniqueChars(s) 來(lái)統(tǒng)計(jì)字符串 s 中的唯一字符,

并返回唯一字符的個(gè)數(shù)。

例如:s = "LEETCODE" ,則其中 "L", "T","C","O","D" 都是唯一字符,

因?yàn)樗鼈冎怀霈F(xiàn)一次,所以 countUniqueChars(s) = 5 。

本題將會(huì)給你一個(gè)字符串 s ,我們需要返回 countUniqueChars(t) 的總和,

其中 t 是 s 的子字符串。輸入用例保證返回值為 32 位整數(shù)。

注意,某些子字符串可能是重復(fù)的,但你統(tǒng)計(jì)時(shí)也必須算上這些重復(fù)的子字符串

(也就是說(shuō),你必須統(tǒng)計(jì) s 的所有子字符串中的唯一字符)。

輸入: s = "ABC"。

輸出: 10。

答案2023-05-08:

1.定義函數(shù) countUniqueChars(s),參數(shù)為字符串 s,返回值為整數(shù)。

2.創(chuàng)建一個(gè)空的哈希表 indies 來(lái)記錄每個(gè)字符出現(xiàn)的位置。

3.遍歷字符串 s 中的每個(gè)字符,對(duì)于每個(gè)字符:

3.1.檢查該字符是否已經(jīng)在 indies 中出現(xiàn)過(guò),如果沒(méi)有則將其加入哈希表,并將初始位置 -1 添加到其位置數(shù)組中。

3.2.將當(dāng)前字符的位置添加到其位置數(shù)組中。

4.初始化計(jì)數(shù)器 res 為 0。

5.遍歷哈希表 indies 中的每個(gè)鍵值對(duì),對(duì)于每個(gè)鍵值對(duì):

5.1.在該鍵所對(duì)應(yīng)的位置數(shù)組的末尾添加字符串 s 的長(zhǎng)度,方便后續(xù)計(jì)算。

5.2.遍歷該鍵所對(duì)應(yīng)的位置數(shù)組中除了開(kāi)頭和結(jié)尾的位置,對(duì)于每組相鄰的位置 i 和 j,計(jì)算左側(cè)有多少個(gè)連續(xù)的該鍵字符和右側(cè)有多少個(gè)連續(xù)的該鍵字符,累加乘積到 res 中。

6.返回計(jì)數(shù)器 res。

注意:該題目要求統(tǒng)計(jì)所有子字符串中的唯一字符的數(shù)量,因此需要遍歷所有子串。具體實(shí)現(xiàn)方法可以枚舉所有子串,或者使用一個(gè)雙重循環(huán)來(lái)分別枚舉子串的起始位置和結(jié)束位置,時(shí)間復(fù)雜度為 O(n^3),其中 n 是字符串 s 的長(zhǎng)度。但由于該題目的數(shù)據(jù)范圍較小,因此可以使用暴力枚舉來(lái)實(shí)現(xiàn)。

時(shí)間復(fù)雜度:

遍歷字符串 s 的時(shí)間復(fù)雜度為 O(n),其中 n 是字符串的長(zhǎng)度。

遍歷哈希表 indies 中的每個(gè)位置數(shù)組的時(shí)間復(fù)雜度為 O(k),其中 k 是該鍵對(duì)應(yīng)的字符在字符串 s 中出現(xiàn)的次數(shù)。

因此,整個(gè)程序的時(shí)間復(fù)雜度為 O(nk)。

額外空間復(fù)雜度:

哈希表 indies 和每個(gè)鍵所對(duì)應(yīng)的位置數(shù)組的空間復(fù)雜度都是 O(k),其中 k 是該鍵對(duì)應(yīng)的字符在字符串 s 中出現(xiàn)的次數(shù)。因此,整個(gè)程序的額外空間復(fù)雜度為 O(nk)。

go完整代碼如下:

package main

import "fmt"

func uniqueLetterString(s string) int {
    // key : 某一種字符
    // value : 出現(xiàn)這種字符依次的位置
    indies := make(map[byte][]int)
    for i := 0; i < len(s); i++ {
        c := s[i]
        if _, ok := indies[c]; !ok {
            indies[c] = []int{-1}
        }
        indies[c] = append(indies[c], i)
    }
    res := 0
    for _, arr := range indies {
        arr = append(arr, len(s))
        for i := 1; i < len(arr)-1; i++ {
            res += (arr[i] - arr[i-1]) * (arr[i+1] - arr[i])
        }
    }
    return res
}

func main() {
    s := "ABC"
    res := uniqueLetterString(s)
    fmt.Println(res)
}

[圖片上傳失敗...(image-584ba7-1683552919656)]

rust完整代碼如下:

use std::collections::HashMap;

fn unique_letter_string(s: &str) -> i32 {
    // key : 某一種字符
    // value : 出現(xiàn)這種字符依次的位置
    let mut indies: HashMap<char, Vec<i32>> = HashMap::new();
    for (i, c) in s.chars().enumerate() {
        indies.entry(c).or_insert_with(Vec::new).push(i as i32);
    }
    let mut res = 0;
    for (_, arr) in indies.iter() {
        let mut arr = arr.clone();
        arr.insert(0, -1);
        arr.push(s.len() as i32);
        for i in 1..arr.len() - 1 {
            res += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);
        }
    }
    res as i32
}

fn main() {
    let s = "ABC";
    let res = unique_letter_string(s);
    println!("{}", res);
}

[圖片上傳失敗...(image-9a171a-1683552919656)]

c完整代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_N 1000

struct Vector {
    int data[MAX_N];
    int size;
};

void vector_init(struct Vector* vec) {
    memset(vec->data, -1, sizeof(vec->data));
    vec->data[0] = -1;
    vec->size = 1;
}

void vector_push_back(struct Vector* vec, int x) {
    vec->data[vec->size++] = x;
}

int uniqueLetterString(char* s) {
    // key : 某一種字符
    // value : 出現(xiàn)這種字符依次的位置
    struct Vector indies[256];
    int cnt[256] = { 0 };
    for (int i = 0; s[i]; i++) {
        char c = s[i];
        if (cnt[c] == 0) {
            vector_init(&indies[c]);
        }
        vector_push_back(&indies[c], i);
        cnt[c]++;
    }
    int res = 0;
    for (int c = 0; c < 256; c++) {
        if (cnt[c] == 0) continue;
        vector_push_back(&indies[c], strlen(s));
        for (int i = 1; i < indies[c].size - 1; i++) {
            int left = indies[c].data[i] - indies[c].data[i - 1];
            int right = indies[c].data[i + 1] - indies[c].data[i];
            res += left * right;
        }
    }
    return res;
}

int main() {
    char s[] = "ABC";
    int res = uniqueLetterString(s);
    printf("%d\n", res);
    return 0;
}

[圖片上傳失敗...(image-5afa6d-1683552919656)]

c++完整代碼如下:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int uniqueLetterString(string s) {
    // key : 某一種字符
    // value : 出現(xiàn)這種字符依次的位置
    unordered_map<char, vector<int>> indies;
    for (int i = 0; i < s.length(); i++) {
        char c = s[i];
        if (!indies.count(c)) {
            indies[c] = { -1 };
        }
        indies[c].push_back(i);
    }
    int res = 0;
    for (auto entry : indies) {
        auto arr = entry.second;
        arr.push_back(s.length());
        for (int i = 1; i < arr.size() - 1; i++) {
            res += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);
        }
    }
    return res;
}

int main() {
    string s = "ABC";
    int res = uniqueLetterString(s);
    cout << res << endl;
    return 0;
}

[圖片上傳失敗...(image-8e388c-1683552919656)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容