【JAVA】【刷题子】28.实现strStr()

147 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

一、题目与题目分析

题目

  实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 。
  说明:

  • 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
  • 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。 image.png
      (题目来源:力扣:28.实现strStr()

题目分析

  strStr()函数;管它啥函数,理解要做的事情就好了。就是匹配字符串,返回匹配字符串的首位置。好比一本词典,一本书,拿这个单词(词语)去这本书找,是否有对应的单词(词语)
  举例1: 一个单词书本“abcdefghijklmn”,找里面是否有“cd”单词;有就返回该单词对应的第一个词位置,也就是第三个,对应2(因为第一个匹配的是0)。
  举例2: 又是一个单词书本“abcdefghijklmn”,找里面是否有“adc”单词;但是这里并没有这个词,也就得返回-1。

二、整体逻辑与主要代码

题目分析已经比较清楚了,接下来我们进入代码设计。

整体逻辑

  先判断单词和书本的长度大小,单词都比书本长度大的,直接返回-1(该单词不存在)。如果单词是空的,即就是查空的,也就直接返回0。最后,进行书本和单词匹配,先找到第一个字母匹配的,再进行匹配完整的单词。(第一个字母都不匹配,就不继续往下浪费时间啦~)

主要代码

整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

class Solution {
	public static int strStr(String haystack, String needle) {
		// 查找字符串的不要
		if (needle.length() == 0) {
			return 0;
		}
		// 查找的字符串的长度大于被查找字符串的长度也不要
		if (needle.length() > haystack.length()) {
			return -1;
		}
		// 这里就把haystack比作字典,needle比作字词;在字典里找是否有对应的这个词
		char[] words = needle.toCharArray(); // 单词
		char[] dictionary = haystack.toCharArray(); // 字典
		for (int i = 0; i < dictionary.length; i++) {
			// 遍历字典
			if (dictionary[i] != words[0]) {
				// 单词第一个就不对的跳过
				continue;
			}
			// 字典快翻完了,小于单词长度也直接打断跳出
			if (words.length > dictionary.length - i) {
				break;
			}
			boolean flag = true; // 默认标记单词找到了并完全匹配
			for (int j = 0; j < words.length; j++) {
				if (dictionary[i + j] != words[j]) {
					// 遍历单词,发现单词有不一样的,匹配失败;打断跳出当前j循环
					flag = false;
					break;
				}
			}
			// 匹配上的位置
			if (flag) {
				return i;
			}
		}
		return -1;
	}
}

三、结果展示

结果展示.png

四、人生总结

你好,再见。

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)