10 动态规划分割回文串III

来源:LeetCode第1278题

难度:苦难

描述:给你一个由小写字母组成的字符串s,和一个整数k,请按照下面的要求分割字符串:首先,你可以将s中的部分字符修改为其他的小写字母。接着你需要把s分割成k个非空不想交的子串,并且每个子串都是回文串,请返回以这种方式分割字符串所需要修改的最少字符数。

示例1:

输入:s="abc",k=2
输出:1
解释:可以把字符串分割成"ab"和"c",并修改"ab"中的一个字符,将它变为回文串。

分析:在遇到字符串的问题,可以联想到动态规划,特别的是对于分割问题可以联想到动态规划,最小可进行遍历,从而可以定义一个动态二维数组dp[i][j]表示将字符串s的前i个字符串分割成k个回文子串所需要的最小字符串,可以定义一个辅助函数int minChange(String s,int indexStart,int indexEnd)表示将s的第indexStart到indexEnd之间的字符串转化为回文串所需要的操作次数,从而可以计算for(int k=i-1;k>0;k--){dp[i][j]=Math.min(dp[i][j],dp[k][j-1]+minChange(k+1,i+1))}即可

private int minChange(String s,int indexStart,int indexEnd)
{
int count=0;
int beginIndex=indexStart;
int endIndex=indexEnd;
while(endIndex>beginIndex)
{
if(s.charAt(beginIndex)!=s.charAt(indexEnd))
{
endIndex--;
beginIndex++;
}else
{
count++;
endIndex--;
beginIndex++;
}
}
return count;
}
public int getMinChange(String s,int k)
{
int dp[][]=new int[s.length()][k+1];
for(int i=0;i0;m--)
{
dp[i][j]=Math.min(dp[i][j],dp[m][j-1]+minChange(m+1,i+1));
}
}
}
return dp[s.length()-1][k];
}

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)