Теперь, когда вы посчитали вхождения в символ a
в строке word
, вы можете подсчитать вхождения этого символа в расширенной строке n
символов:
return n / word.length() * aInWord(word) + aInWord(word.substring(0, n % word.length()));
n / word.length()
дает количество полных повторов строки, которые вписываются в n
.Умножение этого числа на aInWord(word)
дает счет a
в повторениях word
, которые точно укладываются в n
.
Остальное - это определение количества повторов в подстроке word
, которая не вписывается в n
, с помощью оператора модуля %
для определения размера частичной подстроки (если есть)При сложении двух отсчетов вместе получается общее количество вхождений в расширенной строке.
Вот чистая версия, которая позволяет избежать дублирования переменных, дополнительных условий и обобщает методы для максимального повторного использования:
class Main {
public static void main(String[] args) {
assert findAmount("aba", 10, "a") == 7;
assert findAmount("a", 100, "a") == 100;
assert findAmount("abca", 10, "a") == 5;
assert findAmount("", 10, "a") == 0;
assert findAmount("abcaa", 1000000, "a") == 600000;
assert findAmount("abc", 0, "a") == 0;
assert findAmount("bcd", 10, "a") == 0;
System.out.println("tests passed");
}
public static int findAmount(String word, int n, String target) {
if (word.length() == 0) {
return 0;
}
return n / word.length() * count(target, word) +
count(target, word.substring(0, n % word.length()));
}
public static int count(String target, String s) {
return s.length() - s.replace(target, "").length();
}
}
Попробуйте!