这个问题最近在采访中被问到我无法解决,所以需要一些建议如何解决问题
声明:我不能使用REGEX或任何内置库
*****问题陈述如下*********
**匹配输入:文本(字符串),查询(字符串)输出:如果您可以在文本中找到匹配查询,则返回true,否则返回false如果没有特殊字符,则大多数语言都有一个包含此方法的包含方法。一个特殊的角色:'?' - 如果你找到'?'在查询字符串中,它表示前一个字符是可选的(匹配0或1次)。
例子:
*****我的方法如下*********
public class StringPatternMatch
{
public static bool MatchPattern(string inputText, string pattern)
{
int count = 0; int patternIndex = 0;
for (var i = 0; i < inputText.Length; i++)
{
if (patternIndex > pattern.Length)
break;
if (inputText[i] == pattern[patternIndex] ||
(inputText[i] != pattern[patternIndex] && pattern[patternIndex + 1] == '?'))
count++;
patternIndex++;
}
return pattern.Length == count;
}
}
从一侧到另一侧遍历两个字符串(例如从最右边的字符到最左边的字符串)。如果我们找到匹配的字符,我们在两个字符串中向前移动,增加模式的计数器 - 在结束匹配计数时使用模式长度
此外,我提供了我的代码,但并未涵盖所有情况
当然我没有下一轮,但我仍然在考虑这个问题,并没有找到准确的解决方案 - 希望看到一些有趣的答案!
您的想法可行,但您的实施过于简化:
// assumes the pattern is valid, e.g. no ??
public static boolean matches(String string, String pattern) {
int p = 0; // position in pattern
// because we only return boolean we can discard all optional characters at the beginning of the pattern
while (p + 1 < pattern.length() && pattern.charAt(p + 1) == '?')
p += 2;
if (p >= pattern.length())
return true;
for (int s = 0; s < string.length(); s++) // s is position in string
// find a valid start position for the first mandatory character in pattern and check if it matches
if (string.charAt(s) == pattern.charAt(p) && matches(string, pattern, s + 1, p + 1))
return true;
return false;
}
private static boolean matches(String string, String pattern, int s, int p) {
if (p >= pattern.length()) // end of pattern reached
return true;
if (s >= string.length() || string.charAt(s) != pattern.charAt(p)) // end of string or no match
// if the next character of the pattern is optional check if the rest matches
return p + 1 < pattern.length() && pattern.charAt(p + 1) == '?' && matches(string, pattern, s, p + 2);
// here we know the characters are matching
if (p + 1 < pattern.length() && pattern.charAt(p + 1) == '?') // if it is an optional character
// check if matching the optional character or skipping it leads to success
return matches(string, pattern, s + 1, p + 2) || matches(string, pattern, s, p + 2);
// the character wasn't optional (but matched as we know from above)
return matches(string, pattern, s + 1, p + 1);
}