代码随想录算法训练营第九天| 28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾

题目与题解

28. 实现 strStr()

题目链接:28. 实现 strStr()

代码随想录题解:28. 实现 strStr()

视频讲解:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili

帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili

解题思路:

        KMP不会,暴力先做。两个for循环,外层为要匹配的字符串,内层为模式字符串,一一匹配,遇到不匹配的就将模式字符串向右移一位继续匹配,直到找到匹配的返回外层循环所在位置,或没有匹配的最后返回-1.       

class Solution {
    public int strStr(String haystack, String needle) {
		// 暴力法
		for (int i = 0; i < haystack.length() - needle.length() + 1; i++) {
			for (int j = 0; j < needle.length(); j++) {
				if (haystack.charAt(i + j) != needle.charAt(j))
					break;
				if (j == needle.length() - 1)
					return i;
			}
		}
		return -1;
    }
}

看完代码随想录之后的想法 

        看不懂,后面补

遇到的困难

        看不懂KMP,后面补

459.重复的子字符串

题目链接:459.重复的子字符串

代码随想录题解:​​​​​​​459.重复的子字符串

视频讲解:字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串_哔哩哔哩_bilibili

解题思路:

        KMP不会,就暴力法。

        循环取s的前缀,然后查看其是否可以构成该字符串。中间有一些剪枝操作:子字符串的长度必须是s长度的约数。一旦遇到任一一个子串不匹配的情况,就继续对下一个前缀重复操作。

class Solution {
    public boolean repeatedSubstringPattern(String s) {
		int sublen = 1;
		while (sublen <= s.length()/2) {
			if (s.length() % sublen != 0) {
				sublen++;
				continue;
			}
			String substr = s.substring(0, sublen);
			boolean flag = true;
			for (int i = sublen; i < s.length(); i = i+sublen) {
				for (int j = 0; j < sublen; j++) {
					if (s.charAt(i + j) != substr.charAt(j)) {
						flag = false;
						break;
					}
				}
				if (!flag) break;
			}
			if (flag) return true;
			sublen++;
		}
		return false;
    }
}

看完代码随想录之后的想法 

        看不懂,后面补

遇到的困难

        看不懂KMP,后面补

字符串总结

参考资料:字符串总结

 自己注意一些tips:

  • java中String类型不能编辑,只有StringBuilder可以编辑,或是用toCharArray把字符串变成字符数组后再进行操作
  • String可由char[]构造,构造方法为String(char[])或String(char[], offset, count)
  • StringBuilder有一些字符串专属的方法,如sb.deleteCharAt(i),sb.insert(i, "number");
  • 涉及反转字符串时,有时需要花式反转,用整体反转+局部反转的方式会有意想不到的优点。
  • java里输入用Scanner类型,接收字符串用scanner.nextLine();如果先接收数字,再接收字符串,则要按照int number = scanner.nextInt(); scanner.nextLine(); String s = scanner.nextLine();的顺序进行,防止字符串多了或少了。

双指针回顾

参考资料:双指针总结

 自己注意一些tips:

  • 双指针法的好处是用一层遍历代替两层遍历,有效降低算法的时间复杂度,有时还可以帮助算法原地修改数组,避免使用额外的辅助空间
  • 如果要在一个数组中插入一个长字符串,最好用双指针先得到修改后这个长字符串所需占取的位置范围,然后再从后向前填充字符,避免从前向后填充时,每填充 一个就要向后移动整个数组的情况
  • 链表中常用的是快慢指针,避免多次遍历链表
  • n数之和中,双指针法可以把n^{_{n}}的复杂度降低到n^{_{n-1}},同时计算要注意剪枝的条件和边界条件。

今日收获

        今天一方面是要学KMP,一方面是回顾复习前一周学过的内容,算是给了一个喘息。因为KMP实在是看不懂就先pass了,后面有机会再好好看看吧。

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值