题解 | 计算重复字符串长度

计算重复字符串长度

https://www.nowcoder.com/practice/e172dbac7d9140e98eef66c9ebbe25f8

解题思路

本题要求找出字符串中至少重复一次的子串的最大长度。我们可以通过以下步骤解决:

  1. 枚举所有可能的子串长度
  2. 对于每个长度,检查是否存在重复子串
  3. 记录满足条件的最大长度

关键点

  1. 子串长度范围是1到字符串长度的一半
  2. 需要考虑子串可能重叠的情况
  3. 使用滑动窗口来获取所有可能的子串

代码

#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;

class Solution {
public:
    // 检查指定长度的子串是否存在重复
    bool hasRepeatedSubstring(const string& s, int len) {
        if (len == 0) return false;
        
        unordered_set<string> seen;
        // 使用滑动窗口检查所有可能的子串
        for (int i = 0; i <= s.length() - len; i++) {
            string sub = s.substr(i, len);
            if (seen.count(sub)) {
                return true;
            }
            seen.insert(sub);
        }
        return false;
    }
    
    int findMaxRepeatedLength(const string& s) {
        int maxLen = 0;
        // 枚举所有可能的子串长度
        for (int len = 1; len <= s.length() / 2; len++) {
            if (hasRepeatedSubstring(s, len)) {
                maxLen = len;
            }
        }
        return maxLen;
    }
};

int main() {
    string s;
    cin >> s;
    
    Solution solution;
    cout << solution.findMaxRepeatedLength(s) << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    static class Solution {
        // 检查指定长度的子串是否存在重复
        private boolean hasRepeatedSubstring(String s, int len) {
            if (len == 0) return false;
            
            Set<String> seen = new HashSet<>();
            // 使用滑动窗口检查所有可能的子串
            for (int i = 0; i <= s.length() - len; i++) {
                String sub = s.substring(i, i + len);
                if (seen.contains(sub)) {
                    return true;
                }
                seen.add(sub);
            }
            return false;
        }
        
        public int findMaxRepeatedLength(String s) {
            int maxLen = 0;
            // 枚举所有可能的子串长度
            for (int len = 1; len <= s.length() / 2; len++) {
                if (hasRepeatedSubstring(s, len)) {
                    maxLen = len;
                }
            }
            return maxLen;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        
        Solution solution = new Solution();
        System.out.println(solution.findMaxRepeatedLength(s));
        
        sc.close();
    }
}
class Solution:
    def has_repeated_substring(self, s: str, length: int) -> bool:
        """检查指定长度的子串是否存在重复"""
        if length == 0:
            return False
        
        seen = set()
        # 使用滑动窗口检查所有可能的子串
        for i in range(len(s) - length + 1):
            sub = s[i:i + length]
            if sub in seen:
                return True
            seen.add(sub)
        return False
    
    def find_max_repeated_length(self, s: str) -> int:
        max_len = 0
        # 枚举所有可能的子串长度
        for length in range(1, len(s) // 2 + 1):
            if self.has_repeated_substring(s, length):
                max_len = length
        return max_len

def main():
    s = input().strip()
    solution = Solution()
    print(solution.find_max_repeated_length(s))

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:滑动窗口 + 哈希集合
  • 时间复杂度:,其中 是字符串长度
    • 外层循环:
    • 内层循环:
    • 子串比较:
  • 空间复杂度:,用于存储所有可能的子串
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务