每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Valid Anagram
原題鏈接Valid Anagram
實際上就是判斷兩個字符串中每個字符出現的個數是否相等,直接計算每個字符的個數就可以了。
也可以簡便一點,只用一個unordered_map,對于s中的字符,unordered_map加,對于p中的字符unordered_map減
class Solution { public:bool isAnagram(string s, string t) {if(s.size() != t.size())return false;unordered_map<char, int> hash;for(int i = 0; i < s.size(); ++i){++hash[s[i]];--hash[t[i]];}for(auto count : hash){if(count->second)return false;}return true;} };Find All Anagrams in a String
原題鏈接Find All Anagrams in a String
接上道題,在s中找到所有p出現的位置,對p中字符的順序無要求。
這題和每天一道LeetCode—–給定字符串s和字符數組words,在s中找到words出現的位置,words內部字符串順序無要求很像,只是鏈接中要求的p是字符串數組,數組中的字符串不考慮順序。這里的p是字符串,字符串中的字符不考慮順序。
首先如果每三個比較一次的話會比較慢,因為設計到排序后再比較??梢允褂没瑒哟?#xff0c;保證窗口的大小為p的長度,每次減左加右。這樣可以避免排序,直接比較。
class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> res;if(s.size() < p.size())return res;/* p中字符的個數,只要滑動窗和pcnt相等,就代表找到一個 */vector<int> pcnt(128, 0);for(char ch : p)++pcnt[ch];/* 滑動窗 */vector<int> slide(128, 0);for(int i = 0; i < p.size(); ++i)++slide[s[i]];if(slide == pcnt)res.emplace_back(0);int left = 0;int right = p.size();while(right < s.size()){/* 每次減去左邊的元素,添加右邊的元素 */--slide[s[left]];++slide[s[right]];++left;if(slide == pcnt)res.emplace_back(left);++right;}return res;} };Group Anagrams
原題鏈接Group Anagrams
把給定的字符串數組分類,組成字符相同的是一組。
可以用unordered_map記錄每一類在結果中的下標,如果結果中有這一類,就添加進去,否則,新創一類。
總結
以上是生活随笔為你收集整理的每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----顺时针
- 下一篇: 每天一道LeetCode-----求一个