Рекурсивная функция для сопоставления строки с шаблоном подстановки
Так что я пытался решить это задание целый день, просто не могу его получить.
Следующая функция принимает 2 строки, вторая (не первая), возможно, содержащая*
х (звездочки).*
является заменой строки (пустой, 1 символ или более), она может появиться (только в s2) один раз, дважды, больше или не отображаться вообще, она не может быть смежной с другой*
(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
→ ЛОЖЬ
Я попытался сравнить символы один за другим, используяcharAt
до тех пор, пока не встретится звездочка, проверьте, является ли звездочка пустой, сравнивая последовательный символ (i+1
) с символомs1
в положенииi
, если это правда - продолжить рекурсию сi+1
как счетчикs2
& i
как счетчикs1
;
если false - продолжить рекурсию с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);
}