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 }
复制代码

 

posted @   北叶青藤  阅读(288)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示