[英]Help with string equality in Java
以下函數接受2個字符串,第二個(非第一個)可能包含*
的(星號)。 *
代替字符串(空,1個字符或更多),它可以出現一次(僅在s2中)一次,兩次,更多或根本沒有出現,它不能與另一個*
( ab**c
)相鄰,無需檢查。
public static boolean samePattern(String s1, String s2)
如果字符串具有相同的模式,則返回true。 它必須是遞歸的,不能使用任何循環,靜態或全局變量。 另外, 禁止在String類中使用equals
方法。 可以使用局部變量和方法重載。 只能使用以下方法: charAt(i)
, substring(i)
, substring(i, j)
, length()
。
例子:
1: TheExamIsEasy; 2: "The*xamIs*y" ---> true
1: TheExamIsEasy; 2: "Th*mIsEasy*" ---> true
1: TheExamIsEasy; 2: "*" ---> true
1: TheExamIsEasy; 2: "TheExamIsEasy" ---> true
1: TheExamIsEasy; 2: "The*IsHard" ---> FALSE
我在這個問題上困擾了很多小時! 我需要Java解決方案,請幫助我。
以下是Java中問題的遞歸,無循環解決方案:
static boolean samePattern(String s1, String s2) {
return
s2.isEmpty() ?
s1.isEmpty()
:
s2.charAt(0) == '*' ?
samePattern(s1, s2.substring(1))
|| (!s1.isEmpty() && samePattern(s1.substring(1), s2))
:
!s1.isEmpty() && s2.charAt(0) == s1.charAt(0) ?
samePattern(s1.substring(1), s2.substring(1))
:
false;
}
public static void main(String[] args) {
String[] patterns = {
"The*xamIs*y", // true
"Th*mIsEasy*", // true
"*", // true
"TheExamIsEasy", // true
"The*IsHard", // false
};
for (String pattern : patterns) {
System.out.println(samePattern("TheExamIsEasy", pattern));
}
}
本質上,這是遞歸定義:
s2
為空, samePattern
如果s1
也為空 s2
不為空
*
開頭, samePattern
samePattern
與*
去除 samePattern
與刪除字符s1
(如果有一個) s1
,然后檢查它是否samePattern
對於其余s1, s2
samePattern
,所以它是false
這是上述算法的簡化版本:
static boolean samePatternSimplified(String s1, String s2) {
if (s2.length() == 0) {
return s1.length() == 0;
} else if (s2.charAt(0) == '*') {
return samePatternSimplified(s1, s2.substring(1))
|| (s1.length() != 0 && samePatternSimplified(s1.substring(1), s2));
} else if (s1.length() != 0 && s2.charAt(0) == s1.charAt(0)) {
return samePatternSimplified(s1.substring(1), s2.substring(1));
} else {
return false;
}
}
String.isEmpty()
length()
為0
返回true
。 ?:
運算符 for (String pattern : patterns)
構造
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.