Práctica diaria (encuentre la cadena de agrupación más grande en la cadena continua agrupando en las cadenas especificadas) (dos implementaciones)

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;
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_51529267/article/details/113573978
Recomendado
Clasificación