LeetCode Implement strStr()(字符串中第一次出现给定字符串的位置)(大海捞针)

       呃呃,今天被LeetCode中的一道题搞得挺头大的,我翻译了一下还挺有意思的,也就是大海捞针,乍一看觉着这道题贼简单,实质上就是让你实现一个类似于Java中indexOf()这样的一个函数,搞不懂这道题AC的人为什么只有百分之二十多呢么少,但当自己试图去实现题目要求时才发现这道题没有想象中呢么简单啊,真真硬是磨了一个半小时才AC掉,还是很菜额自己,下面是题目与相关测试用例......

Implement strStr().

Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Example 1:

Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:

Input: haystack = "aaaaa", needle = "bba"
Output: -1

Clarification:

What should we return when needle is an empty string? This is a great question to ask during an interview.

For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().

       开始自己想的是能否在O(n)时间内实现题目要求,但因为种种原因发现并不能,并不是所有算法都可以优化到O(n)时间内的,所以最终环视采取了暴力的方法,我的想法是将haystack中的每个字母分别与needle中的首字母进行比较,如果相同则进入内循环,内循环中比较haystack后续字母与needle的后续字母是否完全相等,如果不相等则将计数器count重置为0,最后判断至haystack末尾是否有count等于needle的长度进而返回该循环的其实索引,也就是第一次给定字符串出现的位置,如果不存在则返回-1。这道题可能难点就是测试用例了,确实很难一次性想的呢么完整,如果想要快速的解决这个问题,这就要求我们平时养成一个良好的编程习惯,从而能以全面的思维去解决问题。下面是我的Java AC:

package com.gaoxue.LeetCode;

public class ImplementIndexOf {

	/**
	 * 磨了一个多小时终于通过了所有测试用例,哇、真的恐怖呃呃
	 * @param haystack
	 * @param needle
	 * @return
	 */
	public int strStr(String haystack, String needle) {
        
		if(needle.length()==0)
			return 0;
		if(needle.length()>haystack.length())
			return -1;
        int count = 0,index;
        for(int i=0;i<haystack.length();i++){
            if(haystack.charAt(i)==needle.charAt(0)) {
            	if(needle.length()==1)
            		return 0;
            	if(i+needle.length()>haystack.length())
            		return -1;
            	index = i+1;
            	for(int j=1;j<needle.length();j++) {
            		if(haystack.charAt(index++)==needle.charAt(j))
            			count++;
            		else {
            			count = 0;
            			break;
            		}
            		if(count==needle.length()-1)
            			return i;
            	}
            }
        }
        return -1;
    }
	public static void main(String[] args) {
		System.out.println(new ImplementIndexOf().strStr("mississippi", "issippi"));
		/*String s = "abc";
		System.out.println(s.indexOf('a'));
		System.out.println(s.indexOf("bc"));*/
	}
}
       同样有着O(n^2)的暴力,然代码实现确实这样的~
public int strStr2(String haystack, String needle) {
       for (int i = 0;; i++) {
           for (int j = 0;; j++) {
	       if (j == needle.length())
	           return i;
	       if (i + j == haystack.length())
	           return -1;
	       if (needle.charAt(j) != haystack.charAt(i + j))
	           break;
	   }
       }
 }

       已经很简单了吧,然最最genius的解决办法还是下面的实现,惊呆了~

public int strStr3(String haystack, String needle) {
       return haystack.indexOf(needle);
}
       你信么,短短的一行代码是可以AC的,我信是因为我试过了哈哈,欲哭无泪、自己好笨啊~ 不过勤能补拙,虽然第三种方法是可以AC的,但我们平时练习的时候其实是应该自己手动实现的,这样对我们的编程能力会有很大的帮助,当然如果在面试中遇到此类问题,肯定是要寻求最快的方法的,这样不仅可以给其他题目分配充足的时间,更重要的是聪明的解题方法也会给面试官留下深刻的印象,在面试过程会加分很多。那么还是过去曾说过的话,我们在解决问题时不能把视野思维局限在题目本身,这样亦会有聪明的解题方法源于你自己啦~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用reverse函数反转leetcode字符串方法是:将字符串作为参数传入reverse函数,然后将反转后的字符串返回给调用者。例如:let reversedString = reverse("leetcode")。 ### 回答2: 要使用reverse函数反转leetcode这个字符串,可以使用以下步骤: 1. 将字符串"leetcode"转换为字符数组。可以使用字符串的toCharArray()方法,该方法会返回一个字符数组,其每个元素是字符串一个字符。 2. 定义两个指针,left和right,分别指向字符数组的首尾。 3. 循环交换left和right指向的字符,然后将left指针向右移动一位,将right指针向左移动一位,直到left指针大于等于right指针。 4. 将反转后的字符数组转换回字符串。可以使用字符数组的valueOf()方法,该方法会将字符数组转换为一个新的字符串。 以下是用Java代码实现上述步骤的示例: ```java public String reverseString(String s) { // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 定义两个指针 int left = 0; int right = chars.length - 1; // 循环交换字符 while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } // 将字符数组转换为字符串 return String.valueOf(chars); } ``` 通过调用reverseString("leetcode")函数,将会返回字符串"edocteel",即将"leetcode"反转的结果。 ### 回答3: 要使用reverse函数来反转字符串"leetcode",只需将字符串转换为一个列表,然后使用reverse函数来翻转该列表,最后将列表转回字符串即可。 首先,将字符串"leetcode"转换为一个字符列表,可以使用list函数来实现,即list("leetcode"),得到列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']。 接下来,使用reverse函数来反转该列表,即reverse(['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'])。 最后,将翻转后的列表转换回字符串,可以使用join函数将列表的字符连接起来,即''.join(['e', 'd', 'o', 'c', 't', 'e', 'e', 'l'])。 所以,将字符列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']翻转并转换为字符串的过程为:''.join(reverse(list("leetcode"))),得到的结果为"edocteel",即字符串"leetcode"反转后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值