【发布时间】:2019-05-11 08:09:27
【问题描述】:
我阅读了一篇关于检查字符串是否是另一个字符串的子字符串的很好练习的文章。
练习的内容是:
编写一个从命令行获取 2 个字符串参数的程序。 程序必须验证第二个字符串是否是第一个字符串的子字符串 字符串(您不能使用 substr、substring 或任何其他标准 函数包括正则表达式库)。
第二个子字符串中每次出现 * 表示它可以是 匹配第一个字符串的零个或多个字符。
考虑这个例子:输入字符串 1:abcd 输入字符串 2:a*c 程序 应该评估字符串 2 是字符串 1 的子字符串。
另外,星号 (*) 可能被视为常规字符,如果 它前面有一个反斜杠 (\)。反斜杠 (\) 被视为 除星号 (*) 之前的所有情况下的常规字符。
我写了一个简单的应用程序,它首先检查第二个字符串不比第一个长(但有一个问题,当在 ("ab", "a*b") 测试时这是正确的测试,但方法失败) :
public static boolean checkCharactersCount(String firstString, String secondString) {
return (firstString.length() > 0 && secondString.length() > 0) &&
(firstString.length() > secondString.length());
...下一个验证是一个子串:
public static boolean checkSubstring(String firstString, String secondString) {
int correctCharCounter = 0;
int lastCorrectCharAtIndex = -1;
for (int i = 0; i < secondString.length(); i++) {
for (int j = 0; j < firstString.length(); j++) {
if (j > lastCorrectCharAtIndex) {
if ((secondString.charAt(i) == firstString.charAt(j)) || secondString.charAt(i) == '*') {
correctCharCounter++;
lastCorrectCharAtIndex = j;
}
if (correctCharCounter >= secondString.length())
return true;
}
}
}
return false;
}
但是有两个问题:
- 我上面的代码不支持字符连续性(例如 test: checkSubstring("abacd", "bcd") 返回 true,但它是错误的!-应该返回 false)
- 知道如何将特殊符号验证为“\*”吗?测试样本 (checkSubstring("abc", "\b")
您对解决方案的看法如何? :)
【问题讨论】:
-
旁注:转义规则有些奇怪,它们不允许指定反斜杠后跟通配符。
-
@Henry 是的,很难写;P 我们需要使用双反斜杠(“\\”),它定义我们的第二个反斜杠作为真正的反斜杠或其他符号:P
-
不,不可能。
\\*的含义是一个反斜杠(第一个),后跟一个字面星号。 -
@Henry 你是对的 :)
-
请注意,您的长度检查将排除带有“a*b”的“ab”,即使这应该有效,因为星号可以代表零个字符。