Я наткнулся на эту топи c в книге «Взлом кодирования». Задача состоит в том, чтобы найти перестановки данной меньшей строки s в большей строке b. Я мог бы придумать приведенный ниже алгоритм, временная сложность которого O (B x S), где S и B - длины заданных строк меньшего и большего размера соответственно:
import java.util.HashMap;
public class AnagramAlgorithm {
public static void main(String[] args) {
String s = "cbabadcbbabbcbabaabccbabc";
String b = "abbc";
printAnagramsOfB(s, b);
}
public static void printAnagramsOfB(String text, String pattern) {
if(isEmpty(text) || isEmpty(pattern)) {
System.out.println("Invalid Strings");
return;
}
int patternLength = pattern.length();
for (int i = 0; i < text.length() - patternLength + 1; i++) {
String substring = text.substring(i, i + patternLength);
if (isAnagram(pattern, substring)) {
System.out.println("Anagram Found : " + substring);
}
}
}
public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0;
}
public static boolean isAnagram(String pattern, String substring) {
if (pattern.length() != substring.length()) {
System.out.println("SubString length doesn't match the length of Given String");
return false;
}
char[] subStringArr = substring.toCharArray();
char[] patternArr = pattern.toCharArray();
HashMap<Character, Integer> mapPattern = new HashMap<>();
HashMap<Character, Integer> mapSubstring = new HashMap<>();
for (int i = 0; i < subStringArr.length; i++) {
if (mapSubstring.containsKey(subStringArr[i])) {
int count = mapSubstring.get(subStringArr[i]);
mapSubstring.put(subStringArr[i], count + 1);
} else {
mapSubstring.put(subStringArr[i], 1);
}
if (mapPattern.containsKey(patternArr[i])) {
int count = mapPattern.get(patternArr[i]);
mapPattern.put(patternArr[i], count + 1);
} else {
mapPattern.put(patternArr[i], 1);
}
}
return mapPattern.equals(mapSubstring);
}
}
В книге упоминается, что наиболее оптимальным Алгоритм имеет O (B). Я не мог придумать такой алгоритм. Согласно моим мыслям, для общей сложности, чтобы быть O (B), алгоритм, чтобы найти, является ли подстрока анаграммой, должен быть O (1), т.е. без каких-либо циклов. Это вообще возможно? Или есть другой способ реализовать наиболее оптимальный алгоритм?