列表

详情


1156. 单字符重复子串的最大长度

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

 

示例 1:

输入:text = "ababa"
输出:3

示例 2:

输入:text = "aaabaaa"
输出:6

示例 3:

输入:text = "aaabbaaa"
输出:4

示例 4:

输入:text = "aaaaa"
输出:5

示例 5:

输入:text = "abcdef"
输出:1

 

提示:

原站题解

去查看

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

javascript 解法, 执行用时: 64 ms, 内存消耗: 42.1 MB, 提交时间: 2023-06-03 22:05:07

/**
 * @param {string} text
 * @return {number}
 */
var maxRepOpt1 = function(text) {
    const count = new Map();
    for (let i = 0; i < text.length; i++) {
        const c = text[i];
        count.set(c, (count.get(c) || 0) + 1);
    }

    let res = 0;
    for (let i = 0; i < text.length; ) {
        // step1: 找出当前连续的一段 [i, j)
        let j = i;
        while (j < text.length && text[j] === text[i]) {
            j++;
        }
        let curCnt = j - i;

        // step2: 如果这一段长度小于该字符出现的总数,并且前面或后面有空位,则使用 curCnt + 1 更新答案
        if (curCnt < (count.get(text[i] || 0)) && (j < text.length || i > 0)) {
            res = Math.max(res, curCnt + 1);
        }

        // step3: 找到这一段后面与之相隔一个不同字符的另一段 [j + 1, k),如果不存在则 k = j + 1 
        let k = j + 1;
        while (k < text.length && text[k] === text[i]) {
            k++;
        }
        res = Math.max(res, Math.min(k - i, (count.get(text[i]) || 0)));
        i = j;
    }
    return res;
};

golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2023-06-03 22:04:35

func maxRepOpt1(text string) (ans int) {
	cnt := [26]int{}
	for _, c := range text {
		cnt[c-'a']++
	}
	n := len(text)
	for i, j := 0, 0; i < n; i = j {
		j = i
		for j < n && text[j] == text[i] {
			j++
		}
		l := j - i
		k := j + 1
		for k < n && text[k] == text[i] {
			k++
		}
		r := k - j - 1
		ans = max(ans, min(l+r+1, cnt[text[i]-'a']))
	}
	return
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

java 解法, 执行用时: 4 ms, 内存消耗: 39.9 MB, 提交时间: 2023-06-03 22:04:16

class Solution {
    public int maxRepOpt1(String text) {
        int[] cnt = new int[26];
        int n = text.length();
        for (int i = 0; i < n; ++i) {
            ++cnt[text.charAt(i) - 'a'];
        }
        int ans = 0, i = 0;
        while (i < n) {
            int j = i;
            while (j < n && text.charAt(j) == text.charAt(i)) {
                ++j;
            }
            int l = j - i;
            int k = j + 1;
            while (k < n && text.charAt(k) == text.charAt(i)) {
                ++k;
            }
            int r = k - j - 1;
            ans = Math.max(ans, Math.min(l + r + 1, cnt[text.charAt(i) - 'a']));
            i = j;
        }
        return ans;
    }
}

python3 解法, 执行用时: 52 ms, 内存消耗: 16 MB, 提交时间: 2023-06-03 22:03:46

class Solution:
    def maxRepOpt1(self, text: str) -> int:
        cnt = Counter(text)
        n = len(text)
        ans = i = 0
        while i < n:
            j = i
            while j < n and text[j] == text[i]:
                j += 1
            l = j - i
            k = j + 1
            while k < n and text[k] == text[i]:
                k += 1
            r = k - j - 1
            ans = max(ans, min(l + r + 1, cnt[text[i]]))
            i = j
        return ans

上一题