回文字符串 |
难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B |
试题描述
|
给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串?一次操作可以在任意位置插入一个字符,或者删除任意一个字符,或者把任意一个字符修改成任意其他字符。 |
输入
|
字符串 S,只包含'A'-'Z'。
|
输出
|
最少的修改次数。
|
输入示例
|
ABAD
|
输出示例
|
1
|
其他说明
|
对于100%的数据,S的长度不超过100。
|
参考:http://blog.csdn.net/sdjzping/article/details/12151687
1 public class Palindrome 2 { 3 public char[] str; 4 public int[,] visit; 5 public int[,] dp; 6 public Palindrome(string s) 7 { 8 str = s.ToCharArray(); 9 visit = new int[s.Length,s.Length]; 10 dp = new int[s.Length,s.Length]; 11 for (int i = 0; i < s.Length - 1; i++) 12 { 13 for (int j = 0; j < s.Length - 1; j++) 14 { 15 visit[i,j] = 0; 16 dp[i,j] = 0; 17 } 18 } 19 } 20 public int DP(int x, int y) 21 { 22 if (visit[x,y] == 1) 23 return dp[x,y]; 24 else if (x >= y) 25 { 26 visit[x,y] = 1; 27 dp[x,y] = 0; 28 return 0; 29 } 30 else 31 { 32 if (str[x] == str[y]) 33 { 34 dp[x,y] = DP(x + 1, y - 1); 35 visit[x,y] = 1; 36 return dp[x,y]; 37 } 38 else 39 { 40 dp[x,y] = 1 + Math.Min(Math.Min(DP(x + 1, y), DP(x, y - 1)), DP(x + 1, y - 1)); 41 visit[x,y] = 1; 42 return dp[x,y]; 43 } 44 } 45 } 46 47 public static void test(string s , out int dp) 48 { 49 Palindrome pld = new Palindrome(s); 50 dp = pld.DP(0, s.Length - 1); 51 } 52 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 while(true) 6 { 7 Console.WriteLine("请输入字符串:"); 8 string s = Console.ReadLine(); 9 int dp = 0; 10 Palindrome.test(s, out dp); 11 Console.WriteLine(dp); 12 } 13 } 14 }