Вот код для вашего примера с foo и aoo
public List<String> doSmthTricky (String str) {
return Arrays.asList("foo".replaceAll("(^.)(.*)", "$1$2 a$2").split(" "));
}
Для ввода "foo" этот метод возвращает список с 2 строками "foo" и "aoo".
Работает только в том случае, если во входной строке нет пробелов («foo» в вашем примере). В противном случае это немного сложнее.
Как бороться с этим, когда есть больше одинаковых букв? "ffoo" в "ffoo", "afoo", "faoo", "aaoo".
Я сомневаюсь, что здесь могут помочь регулярные выражения, вы хотите генерировать строки на основе исходной строки, это не задача для регулярного выражения.
UPD : я создал рекурсивную функцию (на самом деле это полурекурсивная полу-итерация), которая генерирует строки на основе строки шаблона, заменяя свои первые символы на символы из указанного набора:
public static List<String> generatePermutations (String template, String chars, int depth, List<String> result) {
if (depth <= 0) {
result.add (template);
return result;
}
for (int i = 0; i < chars.length(); i++) {
String newTemplate = template.substring(0, depth - 1) + chars.charAt(i) + template.substring(depth);
generatePermutations(newTemplate, chars, depth - 1, result);
}
generatePermutations(template, chars, depth - 1, result);
return result;
}
Параметр @depth
означает, сколько символов в начале строки следует заменить. Количество перестановок (chars.size() + 1) ^ depth
.
Тесты:
System.out.println(generatePermutations("ffoo", "a", 2, new LinkedList<String>()));
Output: [aaoo, faoo, afoo, ffoo]
--
System.out.println(generatePermutations("ffoo", "ab", 3, new LinkedList<String>()));
Output: [aaao, baao, faao, abao, bbao, fbao, afao, bfao, ffao, aabo, babo, fabo, abbo, bbbo, fbbo, afbo, bfbo, ffbo, aaoo, baoo, faoo, aboo, bboo, fboo, afoo, bfoo, ffoo]