LeetCode #1156 Swap For Longest Repeated Character Substring 单字符重复子串的最大长度

1156 Swap For Longest Repeated Character Substring 单字符重复子串的最大长度

Description:
You are given a string text. You can swap two of the characters in the text.

Return the length of the longest substring with repeated characters.

Example:

Example 1:

Input: text = "ababa"
Output: 3
Explanation: We can swap the first 'b' with the last 'a', or the last 'b' with the first 'a'. Then, the longest repeated character substring is "aaa" with length 3.

Example 2:

Input: text = "aaabaaa"
Output: 6
Explanation: Swap 'b' with the last 'a' (or the first 'a'), and we get longest repeated character substring "aaaaaa" with length 6.

Example 3:

Input: text = "aaaaa"
Output: 5
Explanation: No need to swap, longest repeated character substring is "aaaaa" with length is 5.

Constraints:

1 <= text.length <= 2 * 10^4
text consist of lowercase English characters only.

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

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

示例 :

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示:

1 <= text.length <= 20000
text 仅由小写英文字母组成。

思路:

模拟
只会出现 2 种情况
一段连续的加上其他地方的, 如 ...aaaa...a..., 可以移动之后形成 ...aaaaa..., 总数为连续最长的加 1
一段连续的中间只有一个其他字符, 如 ...aaabaaa...a..., 可以将 b 和 a 交换形成 ...aaaaaaa...b..., 总数为两端的总和加 1
先记录所有字符出现的次数
然后记录相同字符出现的长度
一边遍历一边更新结果
时间复杂度为 O(n), 空间复杂度为 O(n)

代码:
C++:

class Solution 
{
public:
    int maxRepOpt1(string text) 
    {
        int n = text.size(), result = 0, idx = -1, nums[n];
        unordered_map<int, int> pos;
        for (const auto c : text) ++pos[c];
        for (int i = 0; i < n; i++)
        {
            int j = i;
            while (j < n and text[j] == text[i]) ++j;
            nums[++idx] = j - i;
            result = (idx > 1 and nums[idx - 1] == 1 and i > 1 and text[i - 2] == text[i]) ? max(result, min(nums[idx] + nums[idx - 2] + 1, pos[text[i]])) : max(result, min(nums[idx] + 1, pos[text[i]]));
            i = j - 1;
        }
        return result;
    }
};

Java:

class Solution {
    public int maxRepOpt1(String text) {
        int n = text.length(), result = 0, idx = -1, nums[] = new int[n];
        Map<Character, Integer> pos = new HashMap<>();
        for (char c : text.toCharArray()) pos.put(c, pos.getOrDefault(c, 0) + 1);
        for (int i = 0; i < n; i++) {
            int j = i;
            while (j < n && text.charAt(j) == text.charAt(i)) ++j;
            nums[++idx] = j - i;
            result = (idx > 1 && nums[idx - 1] == 1 && i > 1 && text.charAt(i - 2) == text.charAt(i)) ? Math.max(result, Math.min(nums[idx] + nums[idx - 2] + 1, pos.get(text.charAt(i)))) : Math.max(result, Math.min(nums[idx] + 1, pos.get(text.charAt(i))));
            i = j - 1;
        }
        return result;
    }
}

Python:

class Solution:
    def maxRepOpt1(self, text: str) -> int:
        result, idx, nums, i, c = 0, -1, [0] * (n := len(text)), 0, Counter(text)
        while i < n:
            j = i
            while j < n and text[j] == text[i]:
                j += 1
            idx += 1
            nums[idx] = j - i
            result = max(result, min(nums[idx] + nums[idx - 2] + 1, c[text[i]])) if idx > 1 and nums[idx - 1] == 1 and i > 1 and text[i - 2] == text[i] else max(result, min(nums[idx] + 1, c[text[i]]))
            i = j
        return result
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容