【双指针】先把连续的字符统计个数, 然后双指针i和j分别从头和尾开始枚举计数和字符链表,如果相同就在答案中减去两者的个数。最后如果i == j,这个字符的个数不为1,那么就可以消为0,否则返回答案即可。
class Solution {
// 00:00
public int minimumLength(String s) {
List<Character> ch = new ArrayList();
List<Integer> cnt = new ArrayList();
char pre = s.charAt(0);
int n = s.length(), t = 1;
for (int i = 1; i < n; i++) {
char c = s.charAt(i);
if (c != pre) {
ch.add(pre); cnt.add(t);
pre = c; t = 0;
}
t++;
}
ch.add(pre); cnt.add(t);
int m = ch.size(), i = 0, j = m - 1, ans = n;
for (; i < j; i++, j--) {
if (ch.get(i) == ch.get(j)) {
ans -= cnt.get(i) + cnt.get(j);
} else break;
}
if (i == j && cnt.get(i) != 1) return 0;
return ans;
}
}
class Solution {
// 1:47
public int minimumLength(String s) {
int n = s.length(), i = 0, j = n - 1;
char c = ' ';
while (i < j) {
if (s.charAt(i) != s.charAt(j)) break;
c = s.charAt(i);
while (i < j && s.charAt(i) == c) i++;
while (i < j && s.charAt(j) == c) j--;
}
if (i == j) return s.charAt(i) == c ? 0: 1;
return j - i + 1;
}
}
这个判断i == j边界的方法比较好,如果s[i] == c,说明两侧曾经被删除过c,也就是s[i]不是只有一个,但是如果s[i] != c的话,说明s[i] 只是唯一的一个,也就是不能被删除掉。
class Solution {
public:
// 16:51
int minimumLength(string s) {
int n = s.length(), i = 0, j = n - 1;
char c = ' ';
while (i < j) {
if (s[i] != s[j]) break;
c = s[i];
while (i < j && s[i] == c) i++;
while (i < j && s[j] == c) j--;
}
if (i == j) return s[i] == c? 0: 1;
return j - i + 1;
}
};