1. 程式人生 > >LeetCode 438. 找到字串中所有字母異位詞

LeetCode 438. 找到字串中所有字母異位詞

給定一個字串 和一個非空字串 p,找到 中所有是 的字母異位詞的子串,返回這些子串的起始索引。

字串只包含小寫英文字母,並且字串 和 的長度都不超過 20100。

說明:

  • 字母異位詞指字母相同,但排列不同的字串。
  • 不考慮答案輸出的順序。

示例 1:

輸入:
s: "cbaebabacd" p: "abc"

輸出:
[0, 6]

解釋:
起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。
起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。

 示例 2:

輸入:
s: "abab" p: "ab"

輸出:
[0, 1, 2]

解釋:
起始索引等於 0 的子串是 "ab", 它是 "ab" 的字母異位詞。 起始索引等於 1 的子串是 "ba", 它是 "ab" 的字母異位詞。 起始索引等於 2 的子串是 "ab", 它是 "ab" 的字母異位詞。

解題思路:

        先把p排序好,然後遍歷s,每次遍歷都取出p長度的字串排序後看是否和p相同。

        由於有很長的單一字串,所以加了一些判斷條件,判斷新出現的字元在字串p中是否出現過,如果沒出現則直接把這一串字元直接跳過,可以省下很多時間。

        其實可以跟著這個思路做下去,每次判斷字串的頭和尾,把字串出現的次數用陣列儲存,每次只需要比較字元出現字數和p中的字元出現次數就行了,這樣可以省下排序時間。

程式碼:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> v;
        sort(p.begin(), p.end());
        
        map<char, int> m;
        for(int i = 0; i < p.length(); i ++)
            m[p[i]] ++;
        int flag = 0;
        int l = p.length();
        for(int i = 0; i + l <= s.length(); i ++){
            if(flag) if(s[i+l-1] == s[i-1]) {
                v.push_back(i);
                continue;
            }
            else{
                if(m[s[i+l-1]] == 0) i = i+l-1;
                flag = 0;
                continue;
            }
            string a;
            a.append(s.begin()+i, s.begin()+i+l);
            sort(a.begin(), a.end());
            if(a == p) {
                v.push_back(i);
                flag = 1;
            }
            else flag = 0;
        }
        return v;
    }
};

相關推薦

LeetCode 438. 找到字串所有字母

給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。 字串只包含小寫英文字母,並且字串 s 和 p 的長度都不超過 20100。 說明: 字母異位詞指字母相同,但排列不同的字串。 不考慮答案輸出的順序。 示例 

Leetcode 438:找到字串所有字母(最詳細解決方案!!!)

給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。 字串只包含小寫英文字母,並且字串 s 和 p 的長度都不超過 20100。 說明: 字母異位詞指字母相同,但排列不同的字串。 不考慮答案輸出的順序

438. 找到字串所有字母

最後問題縮小為: # 如何讓bac判斷三個元素都在abc中呢? # 比如,bab雖然ab在abc中,但是,沒有c所以也是錯的。 A: 只要保證p中的各個字母個數在s的子串中相同即可。 我的做法(超出時間限制) 思路一: class Solution:

LeetCode 438. Find All Anagrams in a String(找到字串所有字母

Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s. Strings consists of lowercase English

LeetCode 簡單題】98-找到字串所有字母

宣告: 今天是第98道題。給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上

LeetCode438題:找到字串所有字母

原始思路1: 獲取p串的全排列,與s暴力對比 但這種方法時間複雜度太高,主要是因為全排列的複雜度太高,如果p字串長度為n的話,那麼全排列複雜度為O(n!)。嚴重超時。 public class Test { Set<String> set = new HashS

LeetCode242有效字母&&LeetCode438 找到所有字串字母

【242】有效的字母異位詞 給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出:

LeetCode242有效字母&&LeetCode438 找到所有字串字母

【242】有效的字母異位詞 給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true 示例 2: 輸入: s = "rat", t = "ca

438. Find All Anagrams in a String 找到字符串所有字母

app while pan temp 左移 pen 語句 port code 1. 原始題目 給定一個字符串 s 和一個非空字符串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。 字符串只包含小寫英文字母,並且字符串 s 和 p 的長度都不超過

C++ Leetcode初級演算法之有效的字母

給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = “anagram”, t = “nagaram” 輸出: true 示例 2: 輸入: s = “rat”, t = “car” 輸出: false 說明: 你可以假設

Leetcode演算法Java全解答--49. 字母分組

Leetcode演算法Java全解答–49. 字母異位詞分組 文章目錄 Leetcode演算法Java全解答--49. 字母異位詞分組 題目 想法 結果 總結 程式碼 我的答案 大佬們的答

取出字串所有字母(字元)

    public static String getLetter(String a) {         StringBuffer sb = new StringBuffer();        

leetcode 有效的字母

說明 lean 有效 javascrip 給定 ram car ron 輸入 給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true 示例 2:

leetcode 簡單】 第七十題 有效的字母

給定 etc turn dot 怎麽辦 sorted 說明 ott 編寫 給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true 示例 2: 輸

LeetCode--242--有效的字母

時間復雜度 sel spa 說明 復雜度 color lee and nic 問題描述: 給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true

LeetCode 簡單題】66-有效的字母

宣告: 今天是第66道題。給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連

LeetCode】242. 有效的字母

題目連結:https://leetcode-cn.com/problems/valid-anagram/description/ 題目描述 給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 輸入: s = “anagram”, t

LeetCode】49. 字母分組

題目連結:https://leetcode-cn.com/problems/group-anagrams/description/ 題目描述 給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。 示例 輸入: [“eat”, “tea”, “

LeetCode題目--有效的字母(python實現)

題目 給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true

leetcode題庫——字母分組

題目描述: 給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [ ["ate","eat","tea"], ["nat","tan