-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path516.longest-palindromic-subsequence.cpp
More file actions
78 lines (77 loc) · 1.86 KB
/
516.longest-palindromic-subsequence.cpp
File metadata and controls
78 lines (77 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* @lc app=leetcode id=516 lang=cpp
*
* [516] Longest Palindromic Subsequence
*
* https://leetcode.com/problems/longest-palindromic-subsequence/description/
*
* algorithms
* Medium (48.41%)
* Total Accepted: 72.9K
* Total Submissions: 150.5K
* Testcase Example: '"bbbab"'
*
*
* Given a string s, find the longest palindromic subsequence's length in s.
* You may assume that the maximum length of s is 1000.
*
*
* Example 1:
* Input:
*
* "bbbab"
*
* Output:
*
* 4
*
* One possible longest palindromic subsequence is "bbbb".
*
*
* Example 2:
* Input:
*
* "cbbd"
*
* Output:
*
* 2
*
* One possible longest palindromic subsequence is "bb".
*
*/
class Solution {
public:
size_t longestLength(
const string& s,
std::vector<std::vector<size_t>>& longestSubsequenceLength, size_t i,
size_t j) {
if (i > j || i < 0 || j < 0 || i >= s.size() || j >= s.size()) {
return 0;
}
if (longestSubsequenceLength[i][j] == 0) {
if (i == j) {
longestSubsequenceLength[i][j] = 1;
} else if (s[i] == s[j]) {
longestSubsequenceLength[i][j] =
2 + longestLength(s, longestSubsequenceLength, i + 1, j - 1);
} else {
longestSubsequenceLength[i][j] =
std::max(longestLength(s, longestSubsequenceLength, i + 1, j),
longestLength(s, longestSubsequenceLength, i, j - 1));
}
}
return longestSubsequenceLength[i][j];
}
int longestPalindromeSubseq(string s) {
std::vector<std::vector<size_t>> longestSubsequenceLength(
s.size(), std::vector<size_t>(s.size(), 0));
for (int i = s.size() - 1; i >= 0; --i) {
for (size_t j = i; j < s.size(); ++j) {
this->longestLength(s, longestSubsequenceLength, i, j);
}
}
size_t longestLength = longestSubsequenceLength[0][s.size() - 1];
return longestLength;
}
};