Natknąłem się na stwierdzenie problemu, aby znaleźć wszystkie wspólne pod-łańcuchy między podanymi dwoma pod-ciągami w taki sposób, że w każdym przypadku musisz drukować najdłuższy podciąg. Problem jest następujący:Znajdowanie wszystkich wspólnych podciągów dla dwóch ciągów znaków
Napisz program, aby znaleźć wspólne podciągi między dwoma podanymi ciągami. Nie należy jednak zawierać podciągów zawartych w dłuższych wspólnych podciągach.
Na przykład, biorąc pod uwagę ciągach
eatsleepnightxyz
ieatsleepabcxyz
rezultaty powinny być:
eatsleep
(powodueatsleepnightxyz
eatsleepabcxyz
)xyz
(powodueatsleepnightxyz
eatsleepabcxyz
)a
(ze względu naeatsleepnightxyz
eatsleepabcxyz
)t
(ze względu naeatsleepnightxyz
eatsleepabcxyz
)Jednakże, wynikiem powinno nie obejmują
e
zeatsleepnightxyz
eatsleepabcxyz
, ponieważ obae
y jest zawarty weatsleep
wymienionych powyżej. Nie należy również włączaćea
,eat
,ats
itd., Ponieważ są one również objęte usługąeatsleep
.W tym, że nie mają do wykorzystania Smyczkowych metod użytkowych, takich jak: zawiera indexOf, StringTokenizer, Split i wymienić.
Mój algorytm wygląda następująco: Zaczynam od brutalnej siły i przejdę do bardziej zoptymalizowanego rozwiązania, kiedy poprawię moje podstawowe zrozumienie.
For String S1:
Find all the substrings of S1 of all the lengths
While doing so: Check if it is also a substring of
S2.
Próba określenia złożoności mojego podejścia.
Niech oba podane ciągi być N1 i N2-String-String
- Liczba podciągi S1 jest wyraźnie N1 (N1 + 1)/2.
- Ale musimy znaleźć średnią długość podciągu S1.
- Załóżmy, że to m. Znajdziemy m osobno.
- Złożoność czasowa w celu sprawdzenia, czy ciąg m-string jest podciągiem ciągu n-stringowego , to O (n * m).
- Teraz sprawdzamy, czy każdy ciąg m-string jest podciągiem S2, , który jest ciągiem n2.
- to, jak już wcześniej wspomniano, jest O (n m) algorytmu.
- Czas wymagany przez ogólny algorytm następnie jest
- Tn = (Ilość podciągi w S1) * (średnia podciąg lengthtime dla procedury porównania znaków)
- Poprzez wykonywanie niektórych obliczeń, doszedłem do wniosku, że czas złożoność jest O (n m)
- Teraz naszym zadaniem jest znaleźć m pod względem n1.
Próba znalezienia m pod względem n1.
T n = (n) (1) + (n-1), (2) + (n-2), (3) + ..... + (2) (N-1) + (1) (n)
gdzie T n to suma długości wszystkich podłańcuchów.
Średnia będzie stanowić podział tej sumy przez całkowitą liczbę wyprodukowanych substratów.
to tylko jest sumowanie i podział Problem, którego rozwiązanie jest następujące O (n)
Dlatego ...
czas mojego działaniem algorytmu O (n^5).
Mając to na uwadze, napisałem poniższy kod:
package pack.common.substrings;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class FindCommon2 {
public static final Set<String> commonSubstrings = new LinkedHashSet<String>();
public static void main(String[] args) {
printCommonSubstrings("neerajisgreat", "neerajisnotgreat");
System.out.println(commonSubstrings);
}
public static void printCommonSubstrings(String s1, String s2) {
for (int i = 0; i < s1.length();) {
List<String> list = new ArrayList<String>();
for (int j = i; j < s1.length(); j++) {
String subStr = s1.substring(i, j + 1);
if (isSubstring(subStr, s2)) {
list.add(subStr);
}
}
if (!list.isEmpty()) {
String s = list.get(list.size() - 1);
commonSubstrings.add(s);
i += s.length();
}
}
}
public static boolean isSubstring(String s1, String s2) {
boolean isSubstring = true;
int strLen = s2.length();
int strToCheckLen = s1.length();
if (strToCheckLen > strLen) {
isSubstring = false;
} else {
for (int i = 0; i <= (strLen - strToCheckLen); i++) {
int index = i;
int startingIndex = i;
for (int j = 0; j < strToCheckLen; j++) {
if (!(s1.charAt(j) == s2.charAt(index))) {
break;
} else {
index++;
}
}
if ((index - startingIndex) < strToCheckLen) {
isSubstring = false;
} else {
isSubstring = true;
break;
}
}
}
return isSubstring;
}
}
wytłumaczenie mojego kodu:
printCommonSubstrings: Finds all the substrings of S1 and
checks if it is also a substring of
S2.
isSubstring : As the name suggests, it checks if the given string
is a substring of the other string.
Emisji: Biorąc pod uwagę nakłady
S1 = “neerajisgreat”;
S2 = “neerajisnotgreat”
S3 = “rajeatneerajisnotgreat”
W przypadku S1 i S2, wyjście powinno być: neerajis
i great
, ale w ca se S1 i S3, wyjście powinno być: neerajis
, raj
, great
, eat
, ale nadal otrzymuję neerajis
i great
jako wynik. Muszę to zrozumieć.
Jak zaprojektować mój kod?
Jeśli rozwiązałeś ten problem, czy możesz podzielić się swoim rozwiązaniem? – delca85