找出指定字符串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;
}
}