Encuentre todas las cadenas agrupadas más grandes en la agrupación de cadenas continuas en la cadena especificada s
Descripción del título: busque todas las cadenas agrupadas más grandes en la agrupación de cadenas continuas en las cadenas especificadas y ordénelas (primero ordene por la longitud del contenido de la cadena, si la longitud es la misma, luego ordénelas por el contenido)
- Ps Todas las cadenas agrupadas más grandes se refieren a cadenas con un número de caracteres consecutivos mayor o igual a 3 en la cadena original.
- P.ej:
- La cadena "aabbbxxxxzzdddyyyaaaaa" contiene: "aa", "bbb", "xxxx", "zz", "ddd", "yyy", "aaaaa" 7 grupos
- Entre ellos, el número de caracteres consecutivos en los cinco grupos "bbb", "xxxx", "ddd", "yyy" y "aaaaa" es mayor o igual a 3, por lo que estos cinco grupos se denominan "cadenas de agrupación más grandes "por nosotros
- El resultado ordenado es: bbb, ddd, aaa, xxxx, aaaaa
Implementación 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;
}
}
Implementación 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;
}
}