LeetCoder题解之Find All Anagrams in a String

1、题目描述

 

2、题目分析

直接使用 哈希表记录子串的信息,然后对比两个哈希表信息即可

 

3、代码

 1 vector<int> findAnagrams(string s, string p) {
 2         
 3         vector<int> b;
 4         if( s.size()  < p.size() )
 5             return  b;
 6         
 7         vector<int> ans;
 8         map<char,int> m;
 9         for(auto c: p){
10             m[c]++;
11         }
12         
13         map<char,int> sm;
14         for(int i = 0; i < s.size() - p.size()+1; ++i){
15            
16           string sb = s.substr(i,p.size());
17             if( i == 0){
18                 for( auto c : sb){
19                     sm[c]++;
20                 }
21             }else{
22                 if( sm[s[i-1]] <= 1){
23                     sm.erase(s[i-1]);
24                 }else{
25                     sm[s[i-1]]--;
26                 }
27                 
28                 sm[s[i+p.size()-1]]++;
29             }
30                
31             
32             bool m1 = true , m2 = true ;
33             for(map<char,int>::iterator it = sm.begin(); it != sm.end() ; it++){
34                 if( m.find(it->first) == m.end() || m[ it->first] != it->second ){
35                     m1 = false;
36                     break;
37                 }
38                 
39             }
40             
41             if( m1 ==  true ){
42                 for(map<char,int>::iterator it = m.begin() ; it != m.end() ; ++it){
43                     if( sm.find(it->first) == sm.end() || sm[it->first] != it->second){
44                         m2 = false;
45                         break;
46                     }
47                 }
48             }
49             
50             
51             if( m1 == true && m2 == true)
52                 ans.push_back(i);
53                 
54         }
55         
56         
57         return ans;
58         
59     }

 

转载于:https://www.cnblogs.com/wangxiaoyong/p/9546095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值