版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/89063178
-
有效的字母异位词
- 题目描述
给定两个字符串s和t,编写一个函数判断t是否是s的一个字母异位词。例如“anagram”和“nagaram”就是字母异位词。
- 思路
字母异位词值两个词中各个字母的数量相等,但是位置不同的词。因此使用字典统计一个词的字母数,然后再和另为一个词进行比较就可以。
- C++实现
bool isAnagram(string s, string t) { if(s.size()!=t.size())return false; int source[26] = {0};//记录s的字母个数 int target[26] = {0};//记录t的字母个数 for(int i=0;i<s.size();i++){ source[s[i]-'a']++; target[t[i]-'a']++; } //比较各个字母的数量是否相等 for(int i=0;i<26;i++){ if(source[i]!=target[i])return false; } return true; }
-
找到字符串中所有字符异位词
- 题目描述
给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。(字符串只包含小写英文字母)
- 思路
在比例两个长度相同字符串是否是字母异位词是我们仍然使用“一”中的方法,只不过在本题中使用滑动窗口的方法来判断所有子串是否是p的字母异位词。
- C++实现
vector<int> findAnagrams(string s, string p) { //用数组记录p中字符的出现次数 //然后用滑窗扫描s并比较 vector<int> res; if(s.size()==0||p.size()==0||s.size()<p.size())return res; int origin[26] = {0}; int backup[26] = {0}; //统计p中各字符的个数已经s中相同长度滑动窗口中各字符的个数 for(int i=0;i<p.size();i++){ origin[p[i]-'a']++; backup[s[i]-'a']++; } if(valid(backup,origin))res.push_back(0); //在s上滑动大小为p.size()的窗口 for(int i=1,j=p.size();j<s.size();i++,j++){ backup[s[i-1]-'a']--; backup[s[j]-'a']++; if(valid(backup,origin))res.push_back(i); } return res; } bool valid(int left[],int right[]){ for(int i=0;i<26;i++){ if(left[i]>0&&left[i]!=right[i])return false; } return true; }
-
赎金信
- 题目描述
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)
- 思路
Magazine中包含各个字母的数量应该大于ransom中各个字母的数量。(在字母异位词中则是数量相等)
- C++实现
bool canConstruct(string ransomNote, string magazine) { unordered_map<char,int> hmap; for(int i=0;i<magazine.size();i++){ hmap[magazine[i]]++; } for(int i=0;i<ransomNote.size();i++){ if(hmap[ransomNote[i]]==0) return false; else hmap[ransomNote[i]]--; } return true; }