列表

详情


6425. 找到最长的半重复子字符串

给你一个下标从 0 开始的字符串 s ,这个字符串只包含 0 到 9 的数字字符。

如果一个字符串 t 中至多有一对相邻字符是相等的,那么称这个字符串是 半重复的 。

请你返回 s 中最长 半重复 子字符串的长度。

一个 子字符串 是一个字符串中一段连续 非空 的字符。

 

示例 1:

输入:s = "52233"
输出:4
解释:最长半重复子字符串是 "5223" ,子字符串从 i = 0 开始,在 j = 3 处结束。

示例 2:

输入:s = "5494"
输出:4
解释:s 就是一个半重复字符串,所以答案为 4 。

示例 3:

输入:s = "1111111"
输出:2
解释:最长半重复子字符串是 "11" ,子字符串从 i = 0 开始,在 j = 1 处结束。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int longestSemiRepetitiveSubstring(string s) { } };

python3 解法, 执行用时: 64 ms, 内存消耗: 16.1 MB, 提交时间: 2023-06-11 09:04:18

class Solution:
    def longestSemiRepetitiveSubstring(self, s: str) -> int:
        n, left, right, res, p = len(s), 0, 1, 1, 0
        while right < n:
            if s[right] == s[right-1]:
                p = right
                while right < n - 1 and s[right] != s[right+1]:
                    right += 1
            res = max(res, right - left + 1)
            left, right = p, right + 1
        return res

java 解法, 执行用时: 6 ms, 内存消耗: 43.1 MB, 提交时间: 2023-06-11 09:03:40

class Solution {
    public int longestSemiRepetitiveSubstring(String s) {
        int preLeft = -1, left = 0, maxLen = 1;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == s.charAt(i - 1)) {
                left = preLeft == -1 ? 0 : preLeft;
                preLeft = i;
            }
            maxLen = Math.max(maxLen, i - left + 1);
        }
        return maxLen;
    }
}

python3 解法, 执行用时: 84 ms, 内存消耗: 16.1 MB, 提交时间: 2023-06-11 09:03:09

class Solution:
    def longestSemiRepetitiveSubstring(self, s: str) -> int:
        n=len(s)
        pos=[-1]
        for i in range(n-1):
            if s[i]==s[i+1]:
                pos.append(i)
        pos.append(n-1)
        m=len(pos)
        if m>=3:
            return max([pos[i]-pos[i-2] for i in range(2,m)])
        else:
            return n

cpp 解法, 执行用时: 20 ms, 内存消耗: 6.2 MB, 提交时间: 2023-06-11 09:02:43

class Solution {
public:
  int longestSemiRepetitiveSubstring(string s) {
    int n = s.size();
    int res = 0;
    int left = 0;
    int conflict = 0;
    for (int right = 0; right < n; ++right) {
      if (right > 0 && s[right] == s[right - 1]) {
        ++conflict; // 拓张窗口
        while (conflict > 1) {
          if (s[left] == s[left + 1]) {
            --conflict;
          }
          ++left; // 收缩窗口
        }
      }
      res = max(res, right - left + 1); // 更新答案
    }
    return res;
  }
};

cpp 解法, 执行用时: 12 ms, 内存消耗: 6.1 MB, 提交时间: 2023-06-11 09:02:16

class Solution {
public:
    int longestSemiRepetitiveSubstring(string s) {
        int left=0,flag=0;
        int Max=0;
        int len=s.size();
        for(int i=1;i<s.size();i++)
        {
            if(s[i]==s[i-1])
            {
                if(flag==0)
                    flag=i;
                else{
                    Max=max(Max,i-left);
                    left=flag;
                    flag=i;
                } 
            }
        }
        Max=max(Max,len-left);
        return Max;
    }
};

python3 解法, 执行用时: 96 ms, 内存消耗: 16.1 MB, 提交时间: 2023-06-11 09:01:57

class Solution:
    def longestSemiRepetitiveSubstring(self, s: str) -> int:
        lens, lst = len(s), [x == y for x, y in pairwise(s)]
        for n in range(lens - 1, -1, -1):
            for i in range(lens - n):
                if lst[i: i + n].count(True) <= 1:
                    return n + 1

上一题