지정된 문자열의 연속 문자열 그룹에서 더 큰 그룹 문자열을 모두 찾습니다.
제목 설명 : 지정된 문자열의 연속 문자열 그룹에서 더 큰 그룹화 된 문자열을 모두 찾아서 정렬합니다 (먼저 문자열 콘텐츠의 길이로 정렬하고 길이가 같으면 콘텐츠별로 정렬).
- Ps 더 큰 모든 그룹화 된 문자열은 원래 문자열에서 연속 문자 수가 3 이상인 문자열을 참조합니다.
- 예 :
- "aabbbxxxxzzdddyyyaaaaa"문자열에는 "aa", "bbb", "xxxx", "zz", "ddd", "yyy", "aaaaa"7 개 그룹이 포함됩니다.
- 그 중에서 5 개 그룹 "bbb", "xxxx", "ddd", "yyy", "aaaaa"의 연속 문자 수가 3 개 이상이므로이 5 개 그룹을 "큰 그룹 문자열"이라고합니다. " 우리에 의해
- 정렬 된 결과는 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;
}
}