关于单词匹配的CodingBat Java练习不';没有道理

关于单词匹配的CodingBat Java练习不';没有道理,java,string,Java,String,所以问题是这样的: 给定一个字符串和第二个“word”字符串,如果单词出现在字符串的前面,我们会说它与字符串匹配,除非它的第一个字符不需要完全匹配。在匹配时,返回字符串的前面,或者返回空字符串。因此,字符串“hippo”中的“hi”返回“hi”,而“xip”返回“hip”。单词的长度至少为1。" 首先,我根本不知道这个问题在问什么。其次,我找到了一个解决方案,但我也没有找到解决方案。有人能帮我理解到底发生了什么吗?有没有其他方法 public String startWord(String st

所以问题是这样的:

给定一个字符串和第二个“word”字符串,如果单词出现在字符串的前面,我们会说它与字符串匹配,除非它的第一个字符不需要完全匹配。在匹配时,返回字符串的前面,或者返回空字符串。因此,字符串“hippo”中的“hi”返回“hi”,而“xip”返回“hip”。单词的长度至少为1。"

首先,我根本不知道这个问题在问什么。其次,我找到了一个解决方案,但我也没有找到解决方案。有人能帮我理解到底发生了什么吗?有没有其他方法

public String startWord(String str, String word) {
    if (str.length() < 1) {
       return "";
    }
    if (str.substring(1).indexOf(word.substring(1)) != 0) { // I am utterly confused here, wouldn't this always be true if it starts beyond zero?
        return "";
    }
       return str.substring(0, word.length());
    }
publicstringstartword(stringstr,stringword){
如果(str.length()<1){
返回“”;
}
如果(str.substring(1).indexOf(word.substring(1))!=0{//我在这里完全搞糊涂了,如果它的起始值超过零,这不是总是正确的吗?
返回“”;
}
返回str.substring(0,word.length());
}

您的任务是查看字符串str是否以word开头。但是您没有匹配第一个字符。这就是为什么您使用“1”来指定您只需要字符串和以第二个字符开头的单词。“0”将表示第一个字符。“indexOf”字符串的方法搜索您传入的单词的实例,并返回索引..字符号。。。找到火柴的地方。所以如果它是在开头找到的..第一个字符。。。它将返回0。因为您使用子字符串截断了这两个字符的第一个字符,所以您只是在字符0处查找匹配项

如果在0处找不到索引(-1表示未找到,或大于0表示正在找到的单词,但不在str的开头),则返回空字符串

一个小小的改动是只删掉“word”的第一个字符,看看它是否在str的索引1中找到。但更简单的办法是删掉两个单词的第一个字符,看看它们是否在开头对齐

另一种变体是进行“regex”模式匹配,但这会给您带来不必要的困惑

Original str:  "woogie"
Original word: "goog"
这是一场比赛吗

砍掉第一个字符:

Shortened str: "oogie"
Shortened word: "oog"
发现“oog”从“oogie”的位置0开始,因此indexOf返回0

首先,我甚至不知道这个问题在问什么

您有第一个字符串和第二个字符串(word)

如果出现以下情况,则该单词与第一个字符串匹配:

  • 该单词与第一个字符串的开头匹配
  • 即使单词的第一个字母与前面字符串的第一个字母不匹配,单词也会与第一个字符串的开头匹配
如果单词与第一个字符串匹配,则返回第一个字符串的第一个字长字符。否则,返回一个空字符串

单词的长度至少为1

第二,我找到了一个解决方案,但我也没有找到解决方案。有人能帮我理解到底发生了什么吗

这是我对startWord的解决方案。我希望它更有意义

public String startWord(String str, String word) {
    String x = word.substring(1);
    if (str.startsWith(x, 1)) {
        return str.substring(0, word.length());
    } else {
        return "";
    }
}

啊,所以indexOf方法将子字符串的开头计算为0,即使您从原始字符串的1开始?是的,因为您砍掉了原始字符串的第一个字符,原始字符串的第二个字符(索引1)成为第一个字符(索引0)。
public String startWord(String str, String word) {
  int len1 = str.length();
  int len2 = word.length();
  String withoutFirst = word.substring(1,len2);
  String result = "";
  if(len1>=len2 && len2>0){
   if(str.substring(0,len2).equals(word)){
     result = word;
     }else if(word.substring(1,len2).equals(str.substring(1,len2))){
      result = str.substring(0,1) + word.substring(1,len2);
    }
  }else{
   result = "";
  }
  return result;
}