题目辨析
1.给定一个字符串,需要在原地删除重复出现的元素,使得每个元素只出现一次
(见leetcode第26题 删除排序数组中的重复项)
输入:abbaca
输出:abaca
2.给定一个字符串,重复项删除操作会选择两个相邻且相同的字母,并删除它们
输入:abbaca
输出:ca
输入:abbbaca
输出:abaca
(见leetcode1047. 删除字符串中的所有相邻重复项)
3.给定一个字符串,删除所有相邻并重复的字母
输入:abbbaca
输出:ca
4. 给定一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们
输入:deeedbbcccbdaa, k=3
输出:aa
(见1209. 删除字符串中的所有相邻重复项 II)
待续
JAVA代码
1.给定一个字符串,需要在原地删除重复出现的元素,使得每个元素只出现一次
算法思想: 放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i]=nums[j],我们就增加 j 以跳过重复项
public static String removeDuplicates1(String s) {
char[] chars=s.toCharArray();
int i=0;
for(int j=1;j<chars.length;j++) {
if(chars[j]!=chars[i] ) {
i++;
chars[i]=chars[j];
};
}
char[] result=Arrays.copyOf(chars, i+1);
return new String(result);
}
2.给定一个字符串,.重复项删除操作会选择两个相邻且相同的字母,并删除它们
算法思想: 1.放置两个指针len和j,len指向结果数组的下一个位置,len=0时,char[len]=char[j],len++; j每次移动一步,如果j指向的元素和len-1相等,len–, 否则chars[len++]=chars[j]
2.创建新的字符串
public static String removeDuplicates2(String s) {
char[] chars=s.toCharArray();
int len=0;
for(int j=0;j<chars.length;j++) {
if(len!=0 && chars[j]==chars[len-1]) len--;
else chars[len++]=chars[j];
}
char[] result=Arrays.copyOf(chars, len);
return new String(result);
}
public static String removeDuplicates2_2(String S) {
StringBuilder sb=new StringBuilder();
int len=0;
for(char cc: S.toCharArray()) {
if(len!=0 && cc==sb.charAt(len-1))
sb.deleteCharAt(len-- -1);
else {
sb.append(cc);
len++;
}
}
return sb.toString();
}
3.给定一个字符串,删除所有相邻并重复的字母
算法思想:放置两个指针len和j,len指向结果数组的下一个位置,len=0时,char[len]=char[j],len++; j每次移动一步,如果char[j]==char[len-1],那么就一直比较char[j++]直到不相等,len–,j–; 否则chars[len++]=chars[j]
public static String removeDuplicates3(String S) {
char[] chars=S.toCharArray();
int len=0;
int j=0;
while(j<chars.length) {
if(len!=0 && chars[j]==chars[len-1]) {
while(chars[j]==chars[len-1])
j++;
len--;
j--;
}
else chars[len++]=chars[j];
j++;
}
char[] result=Arrays.copyOf(chars, len);
return new String(result);
}
4. 给定一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们
public static String removeDuplicates4(String s, int k) {
Stack<Integer> counts = new Stack<>();
char[] sa = s.toCharArray();
int j = 0;
for (int i = 0; i < s.length(); ++i, ++j) {
sa[j] = sa[i];
if (j == 0 || sa[j] != sa[j - 1]) {
counts.push(1);
} else {
int incremented = counts.pop() + 1;
if (incremented == k) {
j = j - k;
} else {
counts.push(incremented);
}
}
}
return new String(sa, 0, j);
}
测试用例
public static void main(String[] args) {
String teString1="abbaca";
System.out.println(removeDuplicates1(teString1)); //abaca
System.out.println(removeDuplicates2(teString1)); //ca
String teString2="abbbaca";
System.out.println(removeDuplicates2(teString2)); //abaca
System.out.println(removeDuplicates3(teString2)); //ca
String teString3="deeedbbcccbdaa";
System.out.println(removeDuplicates4(teString3,3)); //aa
}