G面经prepare: Chucked Palindrome

 给定一个字符串,找出最多有多少个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 args
27      */
28     public static void main(String[] args) {
29         // TODO Auto-generated method stub
30         Solution sol = new Solution();
31         int res = sol.countChunk("aaaaaa");
32         System.out.println(res);
33     }
34 
35 }
原文地址:https://www.cnblogs.com/EdwardLiu/p/5136947.html