当前位置: 首页 > 知识库问答 >
问题:

编码蝙蝠挑战:sameEnds

牟辰龙
2023-03-14

CodingBat中的给定任务sameEnds:

给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。

sameEnds("abXYab") → "ab"
sameEnds("xx") → "x"
sameEnds("xxx") → "x"

我的解决方案通过了所有测试,除了一个^:

public String sameEnds(String string) {
  String substringFront = "";
  String substringEnd = "";
  String longestSubstring = "";
  
  for (int i = 1; i < string.length() - 1; i++) {
    substringFront = string.substring(0, i);
    substringEnd = string.substring(i);
    
    if (substringEnd.contains(substringFront)) {
      longestSubstring = substringFront;
    }
  }
  
  return longestSubstring;
}

这里有什么问题?我怎样才能修复它?

共有3个答案

宋和颂
2023-03-14

迭代到字符串中的最后一个元素,更改循环条件可以解决问题。

for (int i = 1; i < string.length(); i++)
秦安宁
2023-03-14

您的代码中有几个问题:

>

  • 在到达最后一个字符之前停止迭代,而不是迭代到包含长度/2(您需要检查开头和结尾而不重叠,因此无需迭代到结尾或几乎)。

    substringEnd应该从右侧开始,因此它应该看起来像string.substring(string.length()-i);

    下面是一个固定的实现:

    public static void main(String[] args) {
        List<String> listTest = List.of("abXYab", "xx", "xxx", "xxxx", "javaXYZjava", "javajava", "Hello! and Hello!", "x", "", "abcd", "mymmy");
        String substringFront, substringEnd, longestMatch;
        for (String string : listTest) {
            longestMatch = "";
            for (int i = 1; i <= string.length() / 2; i++) {
                substringFront = string.substring(0, i);
                substringEnd = string.substring(string.length() - i);
    
                if (substringEnd.equals(substringFront) && substringEnd.length() > longestMatch.length()) {
                    longestMatch = substringEnd;
                }
            }
    
            if (!listTest.equals("")) {
                System.out.printf("%s => %s%n", string, longestMatch);
            } else {
                System.out.printf("%s => null%n", string);
            }
        }
    }
    

    以下是测试上述代码的链接:

    https://www.jdoodle.com/iembed/v0/rEO

    但是,为了使其更简洁,您可以使用正则表达式,它使用带有贪婪量词的捕获组在字符串的开头进行匹配,并确保在开头捕获的内容也在结尾匹配。

    ^(.+)(.*)\1$
    

    这是一个测试正则表达式的链接:

    https://regex101.com/r/cgowDQ/1

    这可以用Java这样写:

    public static void main(String[] args) {
        List<String> listTest = List.of("abXYab", "xx", "xxx", "xxxx", "javaXYZjava", "javajava", "Hello! and Hello!", "x", "", "abcd", "mymmy");
        Pattern pattern = Pattern.compile("^(.+)(.*)\\1$");
        Matcher matcher;
        for (String s : listTest) {
            matcher = pattern.matcher(s);
            if (matcher.find()) {
                System.out.printf("%s => %s%n", s, matcher.group(1));
            } else {
                System.out.printf("%s => null%n", s);
            }
        }
    }
    

    您可以在此处测试上述代码:

    https://www.jdoodle.com/iembed/v0/rEK

  • 陆洛城
    2023-03-14

    除了@Dan和其他人恰当地指出的技术问题外,我还想强调不必要的复杂性问题,这在许多情况下会导致此类逻辑错误。

    考虑到这一点,并考虑到这是一个挑战,我更喜欢一种极简主义的方法,如下面的方法,它不言自明,因此易于理解和调试。

    public String sameEnds(String string) {
      int middle = string.length() / 2;
      for (int i = middle; i >= 0; i--) {
        String left = string.substring(0, i);
        if (string.endsWith(left)) {
          return left;
        }
      }
      return "";
    }
    
     类似资料:
    • 给定CodingBat中的任务maxBlock: 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我的解决方案通过了所有测试,除了一个:

    • 我试图在codingbat上解决这个数组问题,但我有一些问题,我的代码的问题是它没有找到最大的奇数 赋值返回给定数组的一个版本,其中数组中的每个零值都被数组中零值右侧的最大奇数替换。如果零的右边没有奇数,则将零保留为零。 这是我的密码

    • 我是新的编码,并有这个问题的问题,任何帮助都是感激的。 提示:将你的BMI计算四舍五入到小数点后一位。确保返回的消息与显示的完全相同。 我做错了什么!!这就是我得到的错误。 错误:公共字符串BMIResult(双重,双高){

    • 我遇到了一个关于编码蝙蝠的问题,问题是: 给定一个字符串,返回一个由原始字符串的最后2个字符的3个副本组成的新字符串。字符串长度至少为2。我解决了这个问题,解决方案(下图)比我的好,但是,解决方案代码有一个问题,当字符串长度小于2时,假设长度只有1。str索引将是-1。代码还能工作吗?为什么网站说解决方案是正确的?

    • Codingbat的任务: 给定一个字符串,计算以“y”或“z”结尾的单词数——“heavy”中的“y”和“fez”中的“z”,而不是“yellow”中的“y”(不区分大小写)。如果单词后面没有字母,我们会说y或z位于单词的末尾。(注意:测试字符是否为字母。) 我正在尝试这样解决这个任务: 但并不是所有的测试都通过了。如何修复regex=([..^y^z]\b)”以通过所有测试?

    • 这个问题要求在键盘上键入字符串所需的总时间,用一个手指表示为二维字符矩阵。 输入: 第一行包含n和m作为输入,表示键盘矩阵的维数 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 说明:手指最初位于键盘的第一个符号,因此按下该键所需的时间为0。之后,新键位于1,1,因此总时间为|1-0||1-0|即2。现在第三个键位于位置1,2,因此移动到该键的总时间为|2-1||