给定字符串S中存在的子序列T的最大相邻索引差


在这个问题中,我们需要找到给定字符串中存在的子序列的索引之间的最大差值。

为了解决这个问题,我们需要找到子序列在实际顺序和反向顺序中的索引。之后,我们需要取两者的差值。

问题陈述 - 我们给定两个名为“str”和“sub”的字符串。“sub”字符串始终作为子序列存在于“str”字符串中。我们需要找到最大索引成本。索引成本是子序列的两个索引之间的差值。

示例

输入

str = "deeer", sub = "der"

输出

3

解释

  • 我们可以使用{0, 1, 4}、{0, 2, 4}和{0, 3, 4}来获取“sub”。

  • 因此,如果我们取集合{0, 1, 4},我们可以得到最大相邻索引差,即4 - 1 == 3。

输入

str = "abcdef", sub = "acf"

输出

3

解释

  • 子序列存在于{0, 2, 5}索引处。因此,索引之间的最大差值为5 - 2 = 3。

输入

str = "bbbbbbb", sub = "bb";

输出

6

解释 - 我们可以取子序列的{0, 6}索引来获得相邻索引之间的最大差值。

方法1

在这种方法中,我们将按照实际顺序查找子序列索引。之后,我们将按照反向顺序查找子序列索引。我们将从反向索引中减去实际索引以获得最大差值。

让我们通过下面的例子来理解这种方法。

str = "bbbbbbb", sub = "bbb";

  • 当我们按照实际顺序查找子序列索引时,我们将得到{0, 1, 2}索引。

  • 当我们按照反向顺序查找子序列索引时,我们将得到{4, 5, 6}。

  • 最后,我们将减去reverse[p + 1] - actual[p] = 6 - 1 = 5。同样,5 - 0 = 5。这样,我们可以得到最大相邻索引差。

算法

步骤1 - 定义'max_diff'变量来存储最大相邻索引差。另外,定义长度等于子字符串长度的leftInd和rightInd数组来存储子序列的索引,分别从左到右。

步骤2 - 开始遍历给定的字符串。如果指向“sub”字符串的指针大于字符串长度,则中断循环。

步骤3 - 如果字符串中第p个索引处的字符和“sub”字符串中sub_ind索引处的字符相同,则将p值赋给“leftInd”数组并递增sub_ind指针。

步骤4 - 将sub_ind指针初始化为子字符串长度 - 1,并开始反向遍历字符串。

步骤5 - 如果sub_ind小于0,则中断循环。此外,如果字符串的字符和“sub”匹配,则更新“rightInd”数组并将“sub_ind”值减1。

步骤6 - 遍历“leftInd”和“rightInd”数组。如果rightInd[p + 1] - leftInd[p]大于它,则更新maxDiff变量的值。

步骤7 - 返回“maxDiff”值。

示例

#include <bits/stdc++.h>
using namespace std;

int findMaxIndexDiff(string str, string sub, int str_len, int sub_len) {
   // to store maximum index difference
   int maxDiff = 0;
   // to store minimum and maximum possible values of the character index
   int leftInd[sub_len], rightInd[sub_len];

   // pointer for substring
   int sub_ind = 0;
   // traverse the string
   for (int p = 0; p < str_len; p++) {
      if (sub_ind >= sub_len)
         break;
// store the left-most index of the character of a substring in the given string
      if (str[p] == sub[sub_ind]) {
         leftInd[sub_ind] = p;
         sub_ind++;
      }
   }
   sub_ind = sub_len - 1;
   for (int p = str_len - 1; p >= 0; p--) {
      if (sub_ind < 0)
         break;
      // Storing right-most index of character
      if (str[p] == sub[sub_ind]) {
         rightInd[sub_ind] = p;
         sub_ind--;
      }
   }
   for (int p = 0; p < sub_len - 1; p++){
      // Getting the maximum difference
      maxDiff = max(maxDiff, rightInd[p + 1] - leftInd[p]);
   }
   // Return the final answer
   return maxDiff;
}
int main() {
   string str = "deeer", sub = "der";
   int str_len = str.length(), sub_len = sub.length();
   cout << "The maximum index difference for a subsequence present in the given string is " << findMaxIndexDiff(str, sub, str_len, sub_len);
   return 0;
}

输出

The maximum index difference for a subsequence present in the given string is 3

时间复杂度 - O(n + m) 用于遍历字符串和子序列索引数组。

空间复杂度 - O(M) 用于存储子序列的索引。

我们可以取子序列的任何出现并找到其相邻索引之间的最大差值。程序员应该使用不同的输入测试代码,以便更好地理解问题及其解决方案。

更新于:2023年8月24日

96 次浏览

开启您的职业生涯

完成课程获得认证

开始
广告