删除字符串相邻的重复元素-Java实现

题目辨析

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
	}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值