だから私は一日中この課題を解決しようとしてきましたが、それを得ることができません.
次の関数は 2 つの文字列を受け入れます。2 番目 (1 番目ではない) には*
's (アスタリスク) が含まれる可能性があります。
An*
は文字列 (空、1 文字以上) の置換であり、(s2 でのみ) 1 回、2 回、それ以上、またはまったく出現しない可能性があります。別の*
( ab**c
) に隣接することはできません。それを確認する必要はありません。
public static boolean samePattern(String s1, String s2)
文字列が同じパターンの場合、true を返します。再帰的
で
なければならず、ループ、静的およびグローバル変数を使用しないでください。ローカル変数とメソッドのオーバーロードを使用できます。
次のメソッドのみを使用できます: charAt(i)
、substring(i)
、substring(i, j)
、length()
。
例:
1: TheExamIsEasy
; 2: The*xamIs*y
→ 真
1: TheExamIsEasy
; 2: Th*mIsEasy*
→ 真
1: TheExamIsEasy
; 2: *
→ 真
1: TheExamIsEasy
; 2: TheExamIsEasy
→ 真
1: TheExamIsEasy
; 2: The*IsHard
→ 偽
アスタリスクが検出されるまで、文字を 1 つずつ比較してみました。次に、連続する char ( ) をat positionの文字とcharAt
比較して、アスタリスクが空のものかどうかを確認します。のカウンターとして;
false の場合 --両方のカウンタとして再帰を続行します。
別のアスタリスクが見つかるか、文字列の終わりまでこれを続けます。i+1
s1
i
i+1
s2
i
s1
i+1
わからない、私の脳は物事を見失い、集中できない、何か指針/ヒントはありますか?私は正しい方向にいますか?
また、これを解決するためにバックトラッキング技術が使用されると言われています。
これまでの私のコード(理論的にも仕事をしていません):
public static boolean samePattern(String s1, String s2) {
if (s1.equals(s2) || s2 == "*") {
return true;
}
return samePattern(s1, s2, 1);
}
public static boolean samePattern(String s1, String s2, int i)
{
if (s1.equals(s2))
return true;
if (i == s2.length() - 1) // No *'s found -- not same pattern.
return false;
if (s1.substring(0, i).equals(s2.substring(0, i)))
samePattern(s1, s2, i+1);
else if (s2.charAt(i-1) == '*')
samePattern(s1.substring(0, i-1), s2.substring(0, i), 1); // new smaller strings.
else
samePattern(s1.substring(1), s2, i);
}