매일 연습 (지정된 문자열의 연속 문자열 그룹에서 더 큰 그룹 문자열 찾기) (두 가지 구현)

지정된 문자열의 연속 문자열 그룹에서 더 큰 그룹 문자열을 모두 찾습니다.

제목 설명 : 지정된 문자열의 연속 문자열 그룹에서 더 큰 그룹화 된 문자열을 모두 찾아서 정렬합니다 (먼저 문자열 콘텐츠의 길이로 정렬하고 길이가 같으면 콘텐츠별로 정렬).

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

추천

출처blog.csdn.net/weixin_51529267/article/details/113573978