Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归替换子串的最快算法_C++_Algorithm_Substring_Str Replace - Fatal编程技术网

C++ 递归替换子串的最快算法

C++ 递归替换子串的最快算法,c++,algorithm,substring,str-replace,C++,Algorithm,Substring,Str Replace,我正在创建一个函数,它可以在可能的情况下将某个字符串子字符串(不是regex)替换为另一个字符串。我的意思是当我将'ab'替换为'a'时,字符串'aabbabba'转换为'aaaa' 'aabbabba' -> 'aababa' -> 'aaaa' 我想O(n)是真的。基本语言是C++,但我只是在寻找算法。执行此操作的最快算法是什么?为简单起见,首先假设替换字符串的字母是不同的 'abcde' -> 'cde' 我们可以迭代字符串并应用以下规则: 如果下一个字符等于指针上

我正在创建一个函数,它可以在可能的情况下将某个字符串子字符串(不是regex)替换为另一个字符串。我的意思是当我将'ab'替换为'a'时,字符串'aabbabba'转换为'aaaa'

'aabbabba' -> 'aababa' -> 'aaaa'

我想O(n)是真的。基本语言是C++,但我只是在寻找算法。执行此操作的最快算法是什么?

为简单起见,首先假设替换字符串的字母是不同的

'abcde' -> 'cde'
我们可以迭代字符串并应用以下规则:

  • 如果下一个字符等于指针上的下一个字符,则增加最后一个指针。
    • 如果最后一个指针等于被替换字符串的长度(在本例中为
      5
      ),请替换该字符串,删除最后一个指针并从被替换字符串的开头继续
  • 否则,如果下一个字符等于替换字符串的第一个字符(在本例中为
    a
    ),则创建一个新指针
  • 否则清除所有指针
让我们用字符串
'xabxababcde'

v
xabxababcde
x
:清除所有指针。指针:

 v
xabxababcde
    v
xabxababcde
a
:创建新指针。指标:1

  v
xabxababcde
     v
xabxababcde
b
:增加最后一个指针。指标:2

   v
xabxababcde
      v
xabxababcde
x
:清除所有指针。指针:

 v
xabxababcde
    v
xabxababcde
a
:创建新指针。指标:1

  v
xabxababcde
     v
xabxababcde
b
:增加最后一个指针。指标:2

   v
xabxababcde
      v
xabxababcde
a
:创建新指针。指针:2,1

       v
xabxababcde
b
:增加最后一个指针。指针:2,2

        v
xabxababcde
c
:增加最后一个指针。指针:2,3

         v
xabxababcde
d
:增加最后一个指针。指针:2,4

          v
xabxababcde
e
:增加最后一个指针。指针:2,5

此时,我们将
abcde
替换为
cde
,并删除最后一个指针

      v
xabxabcde
c
:增加最后一个指针。指标:3

       v
xabxabcde
d
:增加最后一个指针。指针:4

        v
xabxabcde
e
:增加最后一个指针。指针:5

再换一次

xabxcde
我们完了!此算法适用于替换字符串中的不同元素。为了升级我们的算法,我们需要将第三条规则更改为

  • 将指针移到LPS[pointer]并检查该位置

LPS数组是一个数组,其第n个元素包含最长正确前缀的长度,该前缀也是替换字符串1到n的后缀。为了清楚起见,您可以检查此项

abbaabba:replace ab to a while is mable->abaaba->aaaa据我所知,dupe解决了您的问题。如果没有,请编辑你的问题,使之精确到你要找的内容。@cigien,我编辑过。好的,但我能看到的问题中没有任何内容不是由副本解决的。你试过那里的一些解决方案吗?@cigien,是的,答案那里没有适合我的解决方案,因为duplicate询问了“一次”replaceAll,但我需要做多次,而replaceSubString的索引不是-1。尽管我在上面说过,但做同样的事情对我的需求来说是非常缓慢的。