1. 程式人生 > >LeetCode242有效字母異位詞&&LeetCode438 找到所有字串中的字母異位詞

LeetCode242有效字母異位詞&&LeetCode438 找到所有字串中的字母異位詞

【242】有效的字母異位詞

給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。

示例 1:

輸入: s = "anagram", t = "nagaram"
輸出: true

示例 2:

輸入: s = "rat", t = "car"
輸出: false

說明: 你可以假設字串只包含小寫字母。

class Solution {
public:
    bool isAnagram(string s, string t) {
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        if(s==t)
            return true;
        else
            return false;
    }
};

運用這個思路,繼續做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" 的字母異位詞。
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        
        sort(p.begin(),p.end());
        
        vector<int> res;
        for(int i=0;i<s.size();++i){
            string tmp(s,i,p.size());
            sort(tmp.begin(),tmp.end());
            if(tmp == p)
            {
                res.push_back(i);
            }
        }
        return res;
    }
};

結果:

超時了!!暴力搜尋看來沒戲了,看了網上大神的解釋,這種求子序列的題目一般都用sliding window進行。可以用兩個變數left和right代表滑動串列埠的左右邊界。於是就有以下解法:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        if(s.empty()||s.size()<p.size())
            return res;
        int left = 0;
        int right = p.size() - 1 ;
        int a[26]={0};
        int b[26]={0};
        for(int i=0;i<p.size();i++){
            a[(int)s[i]-'a']++;
            b[(int)p[i]-'a']++;
        }
        while(right<s.size()){
            int i=0;
            for(;i<26;++i){
                if(a[i]!=b[i])
                    break;
            }
            if(i==26)
                res.push_back(left);
            if(right+1 == s.size())
                return res;
            a[(int)s[left]-'a']--;
            right++;
            left++;
            a[(int)s[right]-'a']++;
        }

        return res;
    }
};