欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

題目要求

思路:模擬

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

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

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

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]; // 左邊第一個相同的字符所在位置
            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]; // 右邊第一個相同的字符所在位置
            letters[idx] = i; // 更新當(dāng)前字母最新右位置
        }
        for (int i = 0; i < n; i++)
            res += (i - l[i]) * (r[i] - i);
        return res;
    }
}
  • 時間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(n)

C++

  • 因為memset初始化問題,所以在構(gòu)成結(jié)果的時候多一步判斷。
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]; // 左邊第一個相同的字符所在位置
            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]; // 右邊第一個相同的字符所在位置
            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;
    }
};
  • 時間復(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>()
    }
}
  • 時間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(n)

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

相關(guān)文章

  • Qt編寫地圖實現(xiàn)海量點位標(biāo)注

    Qt編寫地圖實現(xiàn)海量點位標(biāo)注

    海量點位標(biāo)注的出現(xiàn),是為了解決普通設(shè)備點超過幾百個性能極速降低的問題。本文將介紹如何通過Qt實現(xiàn)海量點位標(biāo)注功能,感興趣的可以了解一下
    2022-01-01
  • C++ COM編程之QueryInterface函數(shù)(一)

    C++ COM編程之QueryInterface函數(shù)(一)

    這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(一),QueryInterface是組件本身提供對自己查詢的一個接口,需要的朋友可以參考下
    2014-10-10
  • 使用c語言輸出楊輝三角形的簡單方法

    使用c語言輸出楊輝三角形的簡單方法

    這篇文章主要給大家介紹了關(guān)于如何使用c語言輸出楊輝三角形的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Qt實現(xiàn)字幕滾動效果的示例代碼

    Qt實現(xiàn)字幕滾動效果的示例代碼

    這篇文章主要介紹了Qt如何利用QTimer實現(xiàn)字幕滾動功能,并且可以實現(xiàn)自行更改文本內(nèi)容、自適應(yīng)文本大小、自由調(diào)整速度等功能,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • C語言中字符串處理函數(shù)sscanf的用法

    C語言中字符串處理函數(shù)sscanf的用法

    一直對于一些日期字符串中數(shù)字的提取比較頭疼,現(xiàn)看到 sscanf 對于字符串中的內(nèi)容提取較方便,本文主要介紹了C語言中字符串處理函數(shù)sscanf的用法,具有一定參考價值,感興趣的可以了解一下
    2023-08-08
  • C++ 中

    C++ 中"priority_queue" 優(yōu)先級隊列實例詳解

    這篇文章主要介紹了C++ 中"priority_queue" 優(yōu)先級隊列實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 基于SVN源碼服務(wù)器搭建(詳細(xì)教程分析)

    基于SVN源碼服務(wù)器搭建(詳細(xì)教程分析)

    本篇文章是對SVN源碼服務(wù)器搭建進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Qt實現(xiàn)一個簡單的word文檔編輯器

    Qt實現(xiàn)一個簡單的word文檔編輯器

    本文主要介紹了Qt實現(xiàn)一個簡單的word文檔編輯器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++實現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))

    C++實現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(166.分?jǐn)?shù)轉(zhuǎn)循環(huán)小數(shù))
    2021-07-07
  • C++中std::find函數(shù)介紹和使用場景

    C++中std::find函數(shù)介紹和使用場景

    std::find函數(shù)是一個非常實用的通用查找算法,適用于各種場景,本文主要介紹了C++中std::find函數(shù)介紹和使用場景,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02

最新評論