给定一个字符串,找出最多有多少个chunked palindrome,正常的palindrome是abccba, chunked palindrome的定义是:比如volvo, 可以把vo划分在一起,(vo) (l) (vo),那么它是个palindrome。求实现返回最大的chunk 数量。比如aaaaaa可以是(aaa)(aaa), 但是最大chunk数量应该是(a)(a)(a)(a)(a)(a)为6
这就是一个greedy的问题,从string的两边开始,用i和j记录当前scan到的位置,用prev_i和prev_j记录上一次找到chunk的i和j的位置的下一个字符。最后扫到中间判断一下有无多余的chunk。
时间复杂度为O(N^2), 内层string.equals 有O(N)复杂度
1 package ChunkedPalindrome; 2 3 public class Solution { 4 public int countChunk(String str) { 5 if (str==null || str.length()==0) return 0; 6 int sum = 0; 7 int l=0, r=str.length()-1; 8 int preL = l, preR = r; 9 while (l < r) {10 String left = str.substring(preL, l+1);11 String right = str.substring(r, preR+1);12 if (left.equals(right)) {13 preL = l+1;14 preR = r-1;15 sum += 2;16 }17 l++;18 r--;19 }20 if (preL <= preR) sum+=1;21 return sum;22 }23 24 25 /**26 * @param args27 */28 public static void main(String[] args) {29 // TODO Auto-generated method stub30 Solution sol = new Solution();31 int res = sol.countChunk("aaaaaa");32 System.out.println(res);33 }34 35 }