leetcode字符串的排列

1.暴力法

求出s1的全排列,然后判断s2中是否包含s1的排列之一

代码如下:

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
       //s2包含s1全排列中的一个
       if(s2.size()<s1.size())
         return false;
        if(s2.find(s1)!=string::npos)
         return true;
       //确定s1的全排列
      set<string> tem;
      dfs(s1,0,tem);
      vector<string> res(tem.begin(),tem.end());
       for(int i=0;i<res.size();i++)
         if(s2.find(res[i])!=string::npos)
           return true;
        return false;
    }
    //使用set为了防止s1中存在重复字母
     void dfs(string s,int start,set<string>&tem)
    {
        if(start == s.size() - 1)
        {
            tem.insert(s);
            return;
        }
        for(int i = start;i < s.size();i++)
        {
            swap(s[start],s[i]);
            dfs(s,start + 1,tem);
            swap(s[start],s[i]);
        }
    }
};

结果,超时

2.滑动窗口

维护一个大小为s1.size()的窗口,使用hashmap1记录字符串s1内的字符情况,hashmap2记录字符串s2中滑动窗口内的字符情况,当hashmap1==hashmap2时,则返回true

否则,取掉滑动窗口的第一个字符,然后统计滑动窗口之后的一个字符

代码如下:

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
     if(s1.size()>s2.size())
       return false;
     int len=s1.size();//滑动窗口的大小
     vector<int> hashmap1(26,0);
     vector<int> hashmap2(26,0);

     for(int i=0;i<len;i++)
     {
         hashmap1[s1[i]-'a']++;
         hashmap2[s2[i]-'a']++;
     } 
     for(int i=len;i<s2.size();i++)
     {
         if(hashmap1==hashmap2)
           return true;
        //否则,修改滑动窗口的值
         hashmap2[s2[i-len]-'a']--;
         hashmap2[s2[i]-'a']++;
     }
     return hashmap2==hashmap1;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值