Я пытаюсь найти самую длинную палиндроми c подпоследовательность строки s
, где t
- количество тестовых случаев. Я использую рекурсию, чтобы найти подпоследовательность palindromi c, и при запуске GDB я получаю такой вывод:
Thread 3 hit Breakpoint 1, main () at lps.cpp:30
30 cin >> t;
(gdb) n
1
31 while(t--)
(gdb)
33 string s;
(gdb)
34 cin >> s;
(gdb)
abcbd
35 int n = s.length();
(gdb) n
36 int lps = LPS(s, 0, n - 1);
(gdb)
Thread 3 received signal SIGSEGV, Segmentation fault.
0x000000010000096b in LPS (s=...,
start=<error reading variable: Cannot access memory at address 0x7ffeef3fff28>,
end=<error reading variable: Cannot access memory at address 0x7ffeef3fff24>) at lps.cpp:7
7 {
(gdb)
d∂∂ Это моя программа, и я использовал рекурсию, чтобы найти lps ,
Мой лог c: если начальный и конечный символы совпадают, уменьшите конечный и увеличьте начальный и повторный значения для оставшейся части строки
Если они не совпадают, включите начать и исключить конец для одного вызова и исключить начало и включить завершение в другом вызове, проверить оба значения на самое длинное и вернуть максимум для
#include <iostream>
#include <string>
using namespace std;
int LPS(string s, int start, int end) // start end both inclusive
{
int n = s.length();
if(n == 1) // single character left
return 1;
if(n == 0) // edge condition for 0 characters
return 0;
if(s[start] == s[end])
{
return 2 + LPS(s, start + 1, end - 1);
}
else
{
return max(LPS(s, start + 1, end), LPS(s, start, end - 1));
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
string s;
cin >> s;
int n = s.length();
int lps = LPS(s, 0, n - 1);
cout << lps << endl;
}
return 0;
}