1. 程式人生 > >567. Permutation in String字符串的排列(效率待提高)

567. Permutation in String字符串的排列(效率待提高)

ems 記錄 字符串的排列 swe public col clas spa scu

網址:https://leetcode.com/problems/permutation-in-string/

參考:https://leetcode.com/problems/permutation-in-string/discuss/102588/Java-Solution-Sliding-Window

把s1的各個字母的出現次數記錄下來,對s2利用滑動窗口法,逐步移動窗口,判斷當前窗口內字符串是否是s1的全排列之一。
容易想到,窗口內的字符對應的出現次數要-1。所以,當字符從窗口左端脫離窗口時,要+1;當字符從窗口右端進入窗口時,要-1。

class Solution
{
public:
    bool
allZero(vector<int> count) // 檢查count是否全零 { for(int i : count) { if( i != 0) return false; } return true; } bool checkInclusion(string s1, string s2) { int len1 = s1.size(); int len2 = s2.size();
// if s1 is longer than s2, the answer is definitely false if(len1 > len2) return false; // 用於保存26個字母的使用情況 vector<int> count(26, 0); for(int i=0; i<len1; i++) { // 將s1的各個字母使用次數加 1 count[s1[i] - a]++;
// 此語句實際上為滑動窗口的初始化 count[s2[i] - a]--; } // 判斷第一個滑動窗口 if(allZero(count)) return true; // 移動滑動窗口 for(int i=len1; i<len2; i++) { // count[s2[i] - a]--; count[s2[i-len1] - a]++; // 檢查是否全零。全零代表當前滑動窗口為s1的全排列之一 if(allZero(count)) return true; } return false; } };

567. Permutation in String字符串的排列(效率待提高)