最长唯一子字符串

Longest unique substring

本文关键字:字符串 唯一      更新时间:2023-10-16

这个问题似乎是重复的,但我张贴它,因为我不能找到我想要的解决方案。如果输入字符串是"abcaadafghae",我想要第一个最长唯一子字符串(没有重复字符),应该是"dafgh"。我得到了下面的程序来查找这个子字符串的长度,它是5,但我想要子字符串本身作为输出。

提前感谢。

int lengthOfLongestSubstring(string s) {
  int n = s.length();
  int i = 0, j = 0;
  int maxLen = 0;
  bool exist[256] = { false };
  while (j < n) {
    if (exist[s[j]]) {
      maxLen = max(maxLen, j-i);
      while (s[i] != s[j]) {
        exist[s[i]] = false;
        i++;
      }
      i++;
      j++;
    } else {
      exist[s[j]] = true;
      j++;
    }
  }
  maxLen = max(maxLen, n-i);
  return maxLen;
}

假设这是一个学习练习,下面是如何修改算法以找到最长唯一子字符串的方法。

首先确定代码中修改maxLen的位置。有三个:

  • 设置为0的位置,
  • 设置为max(maxLen, j-i)的位置,和
  • 设置为max(maxLen, n-i)的位置

maxLen替换为maxStr,并按如下方式使用:

  • 将赋值0替换为赋值给空字符串,
  • max(maxLen, j-i)的赋值替换为检查maxStr.length() < (j-i),并将maxStr设置为s的子字符串,从i(含)到j(不含)
  • max(maxLen, n-i)的赋值替换为检查maxStr.length() < (n-i),并将maxStr设置为s的子字符串,从i包含到n,不包含

返回maxStr,这将是您的答案。

演示。

/*C++ program to print the largest substring in a string without repetation of character.
eg. given string :- abcabbabcd
largest substring possible without repetition of character is abcd.*/
     #include<bits/stdc++.h>
     using namespace std;
     int main()
     {
      string str,str1;
      int max =0;
      string finalstr;
      vector<string> str2;
      cin>>str;
    int len = str.length();
    for(int i=0;i<len;i++)
    {
        if(str1.find(str[i]) != std::string::npos)
        {
            str2.push_back(str1);
            char p = str[i];
            str1 = "";
            i--;
            while(p!=str[i])
                i--;
        }
        else
            str1.append(str,i,1);
    }
    str2.push_back(str1);
    for(int i=0;i<str2.size();i++)
    {
        if(max<str2[i].length()){
            max = str2[i].length();
            finalstr  = str2[i];
        }
    }
    cout<<finalstr<<endl;
}