代码随想录算法训练营第9天 | 字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

28. 找出字符串中第一个匹配项的下标

题目链接:LeetCode
文章讲解:代码随想录
视频讲解:哔哩哔哩
编写语言:Java
完成状态:已完成

解题思路

  • 本题是kmp算法的应用,想拓展一下的话可以一试,其他用暴力法也能过

代码

  1. 内置库函数
class Solution {
    public int strStr(String haystack, String needle) {
        // 如果字符串haystack包含子字符串needle
        if (haystack.contains(needle)) {
            // 返回子字符串needle在字符串haystack中的索引位置
            return haystack.indexOf(needle);
        } 
        // 如果字符串haystack不包含子字符串needle,则返回-1
        return -1;
    }
}
  1. 暴力法
class Solution {
    public int strStr(String haystack, String needle) {
        int h_size = haystack.length(); // 获取 haystack 字符串的长度
        int n_size = needle.length(); // 获取 needle 字符串的长度
        
        // aabaabaaf
        // aabaaf
        for (int i = 0; i + n_size <= h_size; i++) { // 遍历 haystack 字符串,确保能够找到 needle 字符串
            boolean flag = true; // 记录是否匹配成功的标志位,默认为真
            for (int j = 0; j < n_size; j++) { // 遍历 needle 字符串
                char h_char = haystack.charAt(i + j); // 获取 haystack 字符串中的字符
                char n_char = needle.charAt(j); // 获取 needle 字符串中的字符
                if (h_char != n_char) { // 如果两个字符不相等
                    flag = false; // 将标志位置为假
                    break; // 结束内层循环
                }
            }

            if (flag == true) { // 如果标志位为真,说明 needle 字符串在 haystack 字符串中完全匹配
                return i; // 返回 needle 字符串在 haystack 字符串中的起始索引
            }
        }
        return -1; // 如果没有找到完全匹配的 needle 字符串,则返回 -1
    }
}

459. 重复的子字符串

题目链接:LeetCode
文章讲解:代码随想录
视频讲解:哔哩哔哩
编写语言:Java
完成状态:已完成

解题思路

  • 将字符串扩充到s+s,删除首尾后,存在原来的字符串

代码

  1. 理清逻辑
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        StringBuffer sb = new StringBuffer(s + s); // 创建一个StringBuffer对象,用于存储s+s的字符串
        sb.delete(0, 1); // 删除第一个字符,即将s拼接到s之后的重复部分截断
        sb.delete(sb.toString().length() - 1, sb.toString().length()); // 删除最后一个字符,保证s在s+s中仅出现一次
        String res = sb.toString(); // 将处理后的字符串转换为String类型
        if (res.contains(s)) { // 判断处理后的字符串是否包含原始字符串s
            return true; // 包含,则说明s是由重复的子串构成的,返回true
        }
        return false; // 不包含,则说明s不是由重复的子串构成的,返回false
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值