【LeetCode】567. 字符串的排列

解題思路

採用力扣上給出的方法五 滑動窗口

注意點

如果採用數組的方式存儲每個字母出現的頻率會出現錯誤,這道題目這裏有坑,我剛開始採用的是數組存,本地可以過,但是交上去不能過
代碼如下,本機沒問題,交上去就是錯,經過PlayGround我發現,本應輸入的字符串爲s1=“ab”,s2=“eidbaooo”,變成了圖中所示樣子
在這裏插入圖片描述

class solution {
public:
	bool checkinclusion(string s1, string s2) {
		int s1map[26];
		int s2map[26];
		if (s1.length() > s2.length()) return false;//s1的長度大於s2,說明s2不會包含s1
		for (int i=0;i<s1.length();i++)
		{
			s1map[s1[i] - 'a']++;//獲取第i給元素出現的頻率
			s2map[s2[i] - 'a']++;
		}
		for (int i=0;i<s2.length()-s1.length();i++)
		{
			if (matches(s1map,s2map))
			{
				return true;//如果出現頻率一樣,說明含有
			}
			s2map[s2[i + s1.length()] - 'a']++;//將新的後續字符添加到所需考慮的新窗口中
			s2map[s2[i] - 'a']--;//去除窗口的第i個字符
		}
		return matches(s1map,s2map);
	}
	bool matches(int s1map[], int s2map[])//判斷窗口內的元素出現頻率是否一樣
	{
		for (int i=0;i<26;i++)
		{
			if (s1map[i]!=s2map[i])
			{
				return false;
			}
		}
		return true;
	}
};

代碼

該代碼爲通過代碼

class Solution {
public:
	bool checkInclusion(string s1, string s2) {
		vector<int> s1map(26);
		vector<int> s2map(26);
		if (s1.length() > s2.length()) return false;//s1的長度大於s2,說明s2不會包含s1
		for (int i = 0; i < s1.length(); i++)
		{
			s1map[s1[i] - 'a']++;//獲取第i給元素出現的頻率
			s2map[s2[i] - 'a']++;
		}
		for (int i = 0; i < s2.length() - s1.length(); i++)
		{
			if (s1map==s2map)
			{
				return true;//如果出現頻率一樣,說明含有
			}
			s2map[s2[i + s1.length()] - 'a']++;//將新的後續字符添加到所需考慮的新窗口中
			s2map[s2[i] - 'a']--;//去除窗口的第i個字符
		}
		return s1map == s2map;
	}
};
發佈了99 篇原創文章 · 獲贊 19 · 訪問量 8202
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章