程序,用于在Python中的T中查找字符串S的所有字谜的开始索引

假设我们有两个字符串S和T,我们必须找到T中S的字谜的所有起始索引。这些字符串仅包含小写字母,并且字符串S和T的长度都不会大于20和100。

因此,如果输入类似于S =“ cab” T =“ bcabxabc”,则输出将为[0,1,5,],作为子字符串“ bca”,“ cab”和“ abc”。

为了解决这个问题,我们将按照以下步骤操作:

  • 定义一个映射m,n:= s的大小,设置左:= 0,右:= 0,计数器:= p的大小

  • 定义一个数组

  • 将p中的字符频率存储到映射m中

  • 正确:= 0至n – 1

    • 而左<右,

    • 如果m没有s [left],则设置left:= right + 1

    • 如果m中不存在s [left],则将counter增加1,并将m [s [left]]增加1

    • 向左增加1

    • 如果m具有s [right]且m [s [right]]非零,则将right减1,然后从循环中得出

    • 如果m具有s [right]且m [s [right]]非零,则将m [s [right]]减1,将counter减1,如果counter = 0,则将left插入ans

    • 除此以外

    • 返回ans

    让我们看下面的实现以更好地理解:

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> findAnagrams(string s, string p) {
          map <char, int> m;
          int n = s.size();
          int left = 0, right = 0;
          int counter = p.size();
          vector <int> ans;
          for(int i = 0; i < p.size(); i++) m[p[i]]++;
          for(int right = 0; right < n; right++){
             if(m.find(s[right]) != m.end() && m[s[right]]){
                m[s[right]]--;
                counter--;
                if(counter == 0)ans.push_back(left);
             } else {
                while(left<right){
                   if(m.find(s[left]) != m.end()) {
                      counter++;
                      m[s[left]]++;
                   }
                   left++;
                   if(m.find(s[right]) != m.end() && m[s[right]]){
                      right--;
                      break;
                   }
                }
                if(m.find(s[left])==m.end())left = right + 1;
             }
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       print_vector(ob.findAnagrams("bcabxabc", "cab")) ;
    }

    输入值

    "bcabxabc", "cab"

    输出结果

    [0, 1, 5, ]