最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java C++ 算法leetcode828統(tǒng)計(jì)子串中唯一字符乘法原理

 更新時(shí)間:2022年09月14日 09:51:11   作者:AnjaVon  
這篇文章主要為大家介紹了Java C++ 算法leetcode828統(tǒng)計(jì)子串中唯一字符乘法原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目要求

思路:模擬

解題的核心思想在于逆向思維,不考慮每個(gè)子數(shù)組中的唯一字符個(gè)數(shù),轉(zhuǎn)而考慮每個(gè)字符可以作為多少個(gè)子數(shù)組的唯一字符;

  • 所以在計(jì)算答案時(shí)的算式和示例中給出的是不一樣的;
  • 在計(jì)算每個(gè)字符“貢獻(xiàn)”【即當(dāng)前向左向右分別可組成的答案?jìng)€(gè)數(shù)】的時(shí)候要用到乘法原理。

對(duì)每一個(gè)字符s[i]s[i]s[i]都記錄其左邊和右邊的第一個(gè)相同字符位置,分別記為l[i]l[i]l[i]和r[i]r[i]r[i],這兩個(gè)位置中間構(gòu)成的就是s[i]s[i]s[i]能夠作為唯一字符的最長(zhǎng)子串,在這個(gè)最長(zhǎng)的子串中還有若干個(gè)較短的子串,此時(shí)s[i]s[i]s[i]的“貢獻(xiàn)”可由到左邊和到右邊的距離相乘計(jì)算得出。

java

class Solution {
    public int uniqueLetterString(String s) {
        char[] cs = s.toCharArray();
        int n = cs.length, res = 0;
        int[] l = new int[n], r = new int[n];
        int[] letters = new int[26];
        Arrays.fill(letters, -1);
        for (int i = 0; i < n; i++) {
            int idx = cs[i] - 'A';
            l[i] = letters[idx]; // 左邊第一個(gè)相同的字符所在位置
            letters[idx] = i; // 更新當(dāng)前字母最新左位置
        }
        Arrays.fill(letters, n);
        for (int i = n - 1; i >= 0; i--) {
            int idx = cs[i] - 'A';
            r[i] = letters[idx]; // 右邊第一個(gè)相同的字符所在位置
            letters[idx] = i; // 更新當(dāng)前字母最新右位置
        }
        for (int i = 0; i < n; i++)
            res += (i - l[i]) * (r[i] - i);
        return res;
    }
}
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(n)

C++

  • 因?yàn)?code>memset初始化問(wèn)題,所以在構(gòu)成結(jié)果的時(shí)候多一步判斷。
class Solution {
public:
    int uniqueLetterString(string s) {
        int n = s.size(), res = 0;
        cout << n << endl;
        int l[n], r[n];
        int letters[26];
        memset(letters, -1, sizeof(letters));
        for (int i = 0; i < n; i++) {
            int idx = s[i] - 'A';
            l[i] = letters[idx]; // 左邊第一個(gè)相同的字符所在位置
            letters[idx] = i; // 更新當(dāng)前字母最新左位置
        }
        memset(letters, -1, sizeof(letters));
        for (int i = n - 1; i >= 0; i--) {
            int idx = s[i] - 'A';
            r[i] = letters[idx]; // 右邊第一個(gè)相同的字符所在位置
            letters[idx] = i; // 更新當(dāng)前字母最新右位置
        }
        for (int i = 0; i < n; i++) {
            int ri = r[i] == -1 ? n : r[i];
            res += (i - l[i]) * (ri - i);
        }
        return res;
    }
};
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(n)

Rust

  • 用Rust的遍歷稍微改一下,思路一樣……
impl Solution {
    pub fn unique_letter_string(s: String) -> i32 {
        let cs = s.as_bytes();
        (0..s.len()).into_iter().map(|i| {
            let (mut l, mut r) = (i - 1, i + 1);
            while l < s.len() && cs[l] != cs[i] {
                l -= 1;
            }
            while r < s.len() && cs[r] != cs[i] {
                r += 1;
            }
            ((i - l) * (r - i)) as i32
        }).sum::<i32>()
    }
}
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(n)

以上就是Java C++ 算法leetcode828統(tǒng)計(jì)子串中唯一字符乘法原理的詳細(xì)內(nèi)容,更多關(guān)于Java C++ 統(tǒng)計(jì)子串唯一字符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++相交鏈表和反轉(zhuǎn)鏈表詳解

    C++相交鏈表和反轉(zhuǎn)鏈表詳解

    這篇文章主要介紹了C++相交鏈表和反轉(zhuǎn)鏈表,結(jié)合實(shí)例形式分析了C++相交鏈表和反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-08-08
  • VScode運(yùn)行C++中文終端亂碼的解決方案

    VScode運(yùn)行C++中文終端亂碼的解決方案

    這篇文章主要介紹了VScode運(yùn)行C++中文終端亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語(yǔ)言高效編程的幾招小技巧

    C語(yǔ)言高效編程的幾招小技巧

    這篇文章主要介紹了C語(yǔ)言高效編程的幾招小技巧,本文講解了以空間換時(shí)間、用數(shù)學(xué)方法解決問(wèn)題以及使用位操作等編輯技巧,并給出若干方法和代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • C++中vector的常用接口詳析說(shuō)明

    C++中vector的常用接口詳析說(shuō)明

    vector類(lèi)我們可以將其看作是一個(gè)能夠動(dòng)態(tài)擴(kuò)容的數(shù)組,下面這篇文章主要給大家介紹了關(guān)于?C++?vector常用接口的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C語(yǔ)言之直接插入排序算法的方法

    C語(yǔ)言之直接插入排序算法的方法

    這篇文章主要為大家介紹了C語(yǔ)言直接插入排序算法的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))

    C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++淺析內(nèi)聯(lián)函數(shù)的使用

    C++淺析內(nèi)聯(lián)函數(shù)的使用

    為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷(xiāo),C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類(lèi)似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-05-05
  • C/C++中不定參數(shù)的使用詳解

    C/C++中不定參數(shù)的使用詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++中不定參數(shù)的使用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 深入理解雙指針的兩種用法

    深入理解雙指針的兩種用法

    本篇文章是對(duì)雙指針的兩種用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ 之explicit關(guān)鍵字

    C++ 之explicit關(guān)鍵字

    今天我們來(lái)談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細(xì)介紹了C語(yǔ)言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細(xì)的代碼實(shí)例,感興趣的同學(xué)可以借鑒參考
    2023-04-04

最新評(píng)論

西林县| 开平市| 深圳市| 湄潭县| 阿拉善右旗| 曲松县| 双辽市| 巨鹿县| 兴安盟| 淮北市| 德格县| 隆昌县| 平邑县| 德清县| 南阳市| 浦东新区| 白河县| 桐梓县| 若尔盖县| 蓬溪县| 克东县| 广东省| 霸州市| 青浦区| 加查县| 海安县| 同心县| 登封市| 甘谷县| 太仓市| 丹凤县| 通州区| 宜黄县| 清新县| 曲水县| 昌都县| 北安市| 乌审旗| 樟树市| 嘉黎县| 长白|