【LeetCode】242.有效的字母异位词、438.找到字符串中所有字母异位词和383.赎金信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bqw18744018044/article/details/89063178
  • 有效的字母异位词

  1. 题目描述

    给定两个字符串s和t,编写一个函数判断t是否是s的一个字母异位词。例如“anagram”和“nagaram”就是字母异位词。

  2. 思路

    字母异位词值两个词中各个字母的数量相等,但是位置不同的词。因此使用字典统计一个词的字母数,然后再和另为一个词进行比较就可以。

  3. 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;
    }
    
  • 找到字符串中所有字符异位词

  1. 题目描述

    给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。(字符串只包含小写英文字母)

  2. 思路

    在比例两个长度相同字符串是否是字母异位词是我们仍然使用“一”中的方法,只不过在本题中使用滑动窗口的方法来判断所有子串是否是p的字母异位词。

  3. 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;
        }
    
  • 赎金信

  1. 题目描述

    给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)

  2. 思路

    Magazine中包含各个字母的数量应该大于ransom中各个字母的数量。(在字母异位词中则是数量相等)

  3. 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;
        }
    

猜你喜欢

转载自blog.csdn.net/bqw18744018044/article/details/89063178
今日推荐