Split String into Most Palindrome Elements
题目地址:
http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=201986&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D1%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311
题目:
input一个string str,方法要求split str into elements,return符合要求的最大elements数量。。这题有点怪我来写几个例子:
eg1. input: abab -》 return 2
可以被分成 ab | ab, 这样子[ab][ab]是对称的;
但是不能分成 a | b | a | b, 因为[a][a]不对称。
eg2.input: teammate -》 return 6
可以被分成 te | a | m | m | a | te, [te][a][m][m][a][te]是对称的
eg3: input: ab -》 return 1.
[ab], 这直接是1
eg4: input: aaa -> reurn 3
这个可以分成 a|a|a 或者直接不分: aaa。 但题目要求返回最大可能值,所以是3
eg5: 空字符串返回0.
解题思路:
这道题可以用动态规划来解。这里需要用到的是二维array。
代码:
http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=201986&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D1%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311
题目:
input一个string str,方法要求split str into elements,return符合要求的最大elements数量。。这题有点怪我来写几个例子:
eg1. input: abab -》 return 2
可以被分成 ab | ab, 这样子[ab][ab]是对称的;
但是不能分成 a | b | a | b, 因为[a][a]不对称。
eg2.input: teammate -》 return 6
可以被分成 te | a | m | m | a | te, [te][a][m][m][a][te]是对称的
eg3: input: ab -》 return 1.
[ab], 这直接是1
eg4: input: aaa -> reurn 3
这个可以分成 a|a|a 或者直接不分: aaa。 但题目要求返回最大可能值,所以是3
eg5: 空字符串返回0.
解题思路:
这道题可以用动态规划来解。这里需要用到的是二维array。
代码:
public class SplitStringintoMostPalindromeElements { public static void main(String[] args){ SplitStringintoMostPalindromeElements splitStringintoMostPalindromeElements = new SplitStringintoMostPalindromeElements(); String s = "teammate"; int rst = splitStringintoMostPalindromeElements.split(s); System.out.println(rst); } public int split(String s){ if(s == null || s.length() <= 1){ return 0; } int len = s.length(); int[][] dp = new int[len][len]; for(int i = 1; i <= len; i++){ for(int j = 0; j <= len - i; j++){ if(i == 1){ dp[j][j + i - 1] = 1; } else if(i == 2){ dp[j][j + i - 1] = s.charAt(j) == s.charAt(j + i - 1) ? 2 : 1; } else{ int left = j; int right = j + i - 1; int sub_len = 1; while(left + sub_len <= right - sub_len){ String str_left = s.substring(left, left + sub_len); String str_right = s.substring(right - sub_len + 1, right + 1); if(str_left.equals(str_right)){ dp[j][j + i - 1] = Math.max(dp[j][j + i - 1], dp[left + sub_len][right - sub_len] + 2); } sub_len += 1; } } } } return dp[0][len - 1]; } }

Comments
Post a Comment