1216. Valid Palindrome III
Given a string s and an integer k, find out if the given string is a K-Palindrome or not.
A string is K-Palindrome if it can be transformed into a palindrome by removing at most k characters from it.
Example 1:
Input: s = "abcdeca", k = 2 Output: true Explanation: Remove 'b' and 'e' characters.
Constraints:
- 1 <= s.length <= 1000
- s has only lowercase English letters.
- 1 <= k <= s.length
这是一道典型的dp题,用dp[][]来存储i,j两个pointer指向的string的一个char, 分别按照相等和不相等来处理即可。
最后,如果length - dp[0][length - 1] <= K, 表明可以,否则不可以。
这题和516. Longest Palindromic Subsequence 本质上是一样的。
1 class Solution { 2 public boolean isValidPalindrome(String s, int k) { 3 int n = s.length(); 4 int[][] f = new int[n][n]; 5 for (int i = 0; i < n; ++i) { 6 f[i][i] = 1; 7 } 8 for (int i = n - 2; i >= 0; --i) { 9 for (int j = i + 1; j < n; ++j) { 10 if (s.charAt(i) == s.charAt(j)) { 11 f[i][j] = f[i + 1][j - 1] + 2; 12 } else { 13 f[i][j] = Math.max(f[i + 1][j], f[i][j - 1]); 14 } 15 if (f[i][j] + k >= n) { 16 return true; 17 } 18 } 19 } 20 return false; 21 } 22 }
这题也可以用递归
先看一下最左和最右的两个值是否相同,如果相同 i++, j--, 同时把k传下去递归
如果不相同而且k is 0, return false, othwewise,
return helper(i++, j, k -1 ) || helper(i, j--, k - 1)
这个递归明显会重复计算,所以要保存之前计算过的值,比如用map保存(i, j)是否可以在k的情况下满足palindrome的条件,最后其实还是会把问题转到dp里去。
1 public class KPalindrome { 2 public static boolean isKPalindrome(String s, int k) { 3 int[][] memo = new int[s.length()][s.length()]; 4 return dfs(s, 0, s.length() - 1, k, memo); 5 } 6 7 private static boolean dfs(String s, int start, int end, int k, int[][] memo) { 8 // Base cases 9 if (k < 0) { 10 return false; // Exceeded the allowed number of deletions 11 } 12 if (start >= end) { 13 return true; // The substring is a palindrome 14 } 15 16 // Check memoization 17 if (memo[start][end] != 0) { 18 return memo[start][end] == 1; 19 } 20 21 if (s.charAt(start) == s.charAt(end)) { 22 // Characters match; move inward 23 memo[start][end] = dfs(s, start + 1, end - 1, k, memo) ? 1 : -1; 24 } else { 25 // Characters don't match; try removing one character 26 boolean removeStart = dfs(s, start + 1, end, k - 1, memo); 27 boolean removeEnd = dfs(s, start, end - 1, k - 1, memo); 28 memo[start][end] = (removeStart || removeEnd) ? 1 : -1; 29 } 30 31 return memo[start][end] == 1; 32 } 33 34 public static void main(String[] args) { 35 String s = "abcdeca"; 36 int k = 2; 37 System.out.println(isKPalindrome(s, k)); // Output: true 38 } 39 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】