每日一练(查找指定字符串s中的连续字符串分组中的较大分组字符串)(两种实现)

找出指定字符串s中的连续字符串分组中的所有较大分组字符串

题目描述:找出指定字符串s中的连续字符串分组中的所有较大分组字符串,并进行排序(先按照字符串内容长度排序,如果长度一致,再按照内容排序)

  • P.s. 所有较大分组字符串是指原字符串中的连续字符数量大于等于3的字符串。
  • 例如:
  • 字符串"aabbbxxxxzzdddyyyaaaaa"中包含:“aa”,“bbb”,“xxxx”,“zz”,“ddd”,“yyy”,"aaaaa"7个分组
  • 其中"bbb",“xxxx”,“ddd”,“yyy”,"aaaaa"五个分组中的连续字符数量大于等于3,所以这五个分组被我们成为“较大分组字符串”
  • 排序后的结果为:bbb, ddd, yyy, xxxx, aaaaa

实现1:

import java.util.Comparator;
import java.util.TreeSet;


public class Program019 {

	public static void main(String[] args) {
		System.out.println(largeGroupPositions("aabbbxxxxzzdddyyyaaaaa"));
	}

	/**
	 * 
	 * @param s 指定字符串
	 * @return TreeSet集合,该集合中的每个元素均为较大分组,并按照规则排序
	 */
	public static TreeSet<String> largeGroupPositions(String s) {
		//创建TreeSet集合并传入比较器对象
		TreeSet<String> set=new TreeSet<String>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				//根据两字符串长度排序,
				if(o1.length()>o2.length()) {
					return 1;
				}else if(o1.length()<o2.length()) {
					return -1;
				}
				//若字符串长度相等,则调用String类中compareTo()方法比较
				return o1.compareTo(o2);
			}
		});
		
		//定义一个num,用于记录截取字符串的起始位置
		int num=0;
		//遍历字符串
		for(int i=0;i<s.length()-1;i++) {
			
			//判断当前字符是否与下一个字符相同,若不相同
			if(s.charAt(i)!=s.charAt(i+1)) {
				//获取下标num至i+1的字符
				String str=s.substring(num, i+1);
				//判断str长度是否大于等于3
				if(str.length()>=3) {
					//若大于,添加至集合set中
					set.add(str);
				}
				//给num传入下一个连续字符的起始下标
				num=i+1;
			}
			//判断当前字符是否是字符串的倒数第二位(若成立,此时,字符串后两位元素定相同)
			if(i==s.length()-2) {
				//截取字符串并添加至集合set中
				set.add(s.substring(num));
			}
		}

		return set;
	}
}

实现2:

public class Program019 {

	public static void main(String[] args) {
		System.out.println(largeGroupPositions("aabbbxxxxzzdddyyyaaaaa"));
	}

	/**
	 * 
	 * @param s 指定字符串
	 * @return TreeSet集合,该集合中的每个元素均为较大分组,并按照规则排序
	 */
	public static TreeSet<String> largeGroupPositions(String s) {
		//用于拼接每个连续字符分组
		StringBuilder sb=new StringBuilder();
		
		//用于排序
		TreeSet<String> set=new TreeSet<String>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if(o1.length()-o2.length()==0) {
					return o1.compareTo(o2);
				}
				return o1.length()>o2.length()?1:-1;
			}
		});
		
		try {
			//遍历每个字符
			for(int i=0;i<s.length();i++) {
				
				//获取当前字符
				char currChar=s.charAt(i);
				sb.append(currChar);//拼接至StringBuilder
				
				//获取下一个字符
				char nextChar=s.charAt(i+1);
				
				//判断是否连续,如果不相等,则意味着不连续
				if(currChar!=nextChar) {
					//判断当前StringBuilder的长度是否大于等于3
					if(sb.length()>=3) {
						//条件成立,代表为较大分组
						set.add(sb.toString());
					}
					//连续字符串中终止,清空原有内容
					sb=new StringBuilder();
				}
			}
			
		}catch(StringIndexOutOfBoundsException e) {
			//如果出现该异常,则代表超出越界,遍历结束
			if(sb.length()>=3) {
				set.add(sb.toString());
			}
		}
		return set;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值