C ++中带有最多两个不同字符的最长子字符串

假设我们有一个字符串s;我们必须找到具有最多2个不同字符的最长子字符串t的长度。

因此,如果输入类似于“ eceba”,则输出将为3,因为t为“ ece”,其长度为3。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数lengthOfLongestSubstringKDistinct(),它将取s,k,

  • 回答:= 0

  • 定义一张映射

  • n:= s的大小,x:= 0

  • 对于初始化j:= 0,i:= 0,当j <n时,更新(j增加1),-

    • (将m [s [i]]减1)

    • 如果m [s [i]]等于0,则-

    • (将i增加1)

    • (将x减少1)

    • (将x增加1)

    • (将m [s [j]]增加1)

    • 如果m [s [j]]与1相同,则-

    • 而(x> k并且i <= j),做-

    • ans:= ans和j的最大值-i + 1

    • 返回ans

    • 从主要方法执行以下操作

    • 返回lengthOfLongestSubstringKDistinct(s,2)

    例 

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

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int lengthOfLongestSubstringKDistinct(string s, int k){
          int ans = 0;
          unordered_map<char, int> m;
          int n = s.size();
          int x = 0;
          for (int j = 0, i = 0; j < n; j++) {
             m[s[j]]++;
             if (m[s[j]] == 1)
                x++;
             while (x > k && i <= j) {
                m[s[i]]--;
                if (m[s[i]] == 0)
                   x--;
                i++;
             }
             ans = max(ans, j - i + 1);
          }
          return ans;
       }
       int lengthOfLongestSubstringTwoDistinct(string s){
          return lengthOfLongestSubstringKDistinct(s, 2);
       }
    };
    main(){
       Solution ob;
       cout << (ob.lengthOfLongestSubstringTwoDistinct("eceba"));
    }

    输入值

    "eceba"

    输出结果

    3