字符串排列作为另一个字符串的子串

9

给定字符串A和另一个字符串B。查找任何B的排列是否存在作为A的子字符串。

例如,

如果A =“encyclopedia”

如果B ="dep",则返回true,因为"ped"是“dep”的排列,并且"ped"是A的子字符串。

My solution->

if length(A)=n and length(B)=m

I did this in 0((n-m+1)*m) by sorting B and then checking A 
with window size of m each time.

我需要找到一个更好、更快的解决方案。


3
这已经是一个不错的方法了。更快一点的方法是,简单地计算B中每个字符出现的频率,然后看看这些计数是否与您考虑的A中每个窗口的计数匹配。 - j_random_hacker
2
使用这种方法,您可以轻松地在每个窗口中以O(1)的时间更新B的频率向量--只需减去一个传出字符的计数,并为传入的字符添加一个计数。 - j_random_hacker
你能否更详细地解释一下? - user2826957
6
  1. freqB [i]中累加字符i在字符串B中出现的次数。(例如,在您的示例中,freqB ['d'] == freqB ['e'] == freqB ['p'] == 1,对于所有其他字符ifreqB [i] == 0。)
  2. 对于A的每个长度为m的窗口,做同样的操作,但将它们存储在freqA []中,然后检查是否对于每个字符ifreqA[i] == freqB[i]。如果是这样,则表示匹配成功。要从从位置j开始的长度为m的窗口移动到下一个窗口,您需要执行--freqA[A[j]]++freqA[A[j+m]]
- j_random_hacker
漂亮的解决方案...谢谢!! - user2826957
11个回答

0

基于使用短字符串的窗口大小检查长字符串。由于排列仅改变字符的位置,因此排序后的字符串将始终相同。


        #include <iostream>
        #include <bits/stdc++.h>
        using namespace std;
        
        int main ()
        {
          string shortone =  "abbc";
          string longone ="cbabadcbbabbcbabaabccbabc";
        
          int s_length = shortone.length ();
          int l_length = longone.length ();
          string sub_string;
          string unsorted_substring; // only for printing
        
          // sort the short one
          sort (shortone.begin (), shortone.end ());
        
          if (l_length > s_length)
            {
                      for (int i = 0; i <= l_length - s_length; i++){
                    
                          sub_string = "";
                          
                          //Move the window
                          sub_string = longone.substr (i, s_length);
                          unsorted_substring=sub_string;
                          
                          // sort the substring window 
                          sort (sub_string.begin (), sub_string.end ());
                          if (shortone == sub_string)
                            {
                              cout << "substring is :" << unsorted_substring << '\t' <<
                            "match found at the position: " << i << endl;
                            }
                
                
                    }
            }
          return 0;
        }



我不清楚为什么对短字符串进行排序会有帮助。 - Vidro3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接