Я очень новичок в программировании и пытаюсь решить одну из самых распространенных проблем последовательности / подстрок в Java.Итак, вопрос алгоритма, над которым я работаю, состоит в том, чтобы найти самую длинную общую подстроку без сокращения слов.
Например: данные string1 = He had 3 pennies and 5 quarters
и string2 = q3nniesp
должны возвращать pennies
.
Другой пример: string1 = They named the new place face cafe
и string2 = e face
, и результат будет e face cafe
.
Я пытаюсь выяснить этот алгоритм, но не могу решить, нужно ли мне преобразовать этик массиву символов или оцените его как строку.То, как в обеих строках могут быть пробелы, сбивает меня с толку.
Я следовал за некоторыми из существующих вопросов о стековом потоке и пытался изменить этот код с https://www.geeksforgeeks.org/
:
static String findLongestSubsequence(String str1, String str2) {
char[] A = str1.toCharArray();
char[] B = str2.toCharArray();
if (A == null || B == null) return null;
final int n = A.length;
final int m = B.length;
if (n == 0 || m == 0) return null;
int[][] dp = new int[n+1][m+1];
// Suppose A = a1a2..an-1an and B = b1b2..bn-1bn
for (int i = 1; i <= n; i++ ) {
for (int j = 1; j <= m; j++) {
// If ends match the LCS(a1a2..an-1an, b1b2..bn-1bn) = LCS(a1a2..an-1, b1b2..bn-1) + 1
if (A[i-1] == B[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
// If the ends do not match the LCS of a1a2..an-1an and b1b2..bn-1bn is
// max( LCS(a1a2..an-1, b1b2..bn-1bn), LCS(a1a2..an-1an, b1b2..bn-1) )
else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
int lcsLen = dp[n][m];
char[] lcs = new char[lcsLen];
int index = 0;
// Backtrack to find a LCS. We search for the cells
// where we included an element which are those with
// dp[i][j] != dp[i-1][j] and dp[i][j] != dp[i][j-1])
int i = n, j = m;
while (i >= 1 && j >= 1) {
int v = dp[i][j];
// The order of these may output different LCSs
while(i > 1 && dp[i-1][j] == v) i--;
while(j > 1 && dp[i][j-1] == v) j--;
// Make sure there is a match before adding
if (v > 0) lcs[lcsLen - index++ - 1] = A[i-1]; // or B[j-1];
i--; j--;
}
return new String(lcs, 0, lcsLen);
}
Но я продолжаю получать неправильные результаты.Например, первый вывод дает output = 3nnies
, я действительно застрял в этой точке, кто-нибудь может дать руку или немного поцарапать алгоритм?Спасибо.