输出一个字符串中最长的双节棍字符串

形似如同aa…bb…c…,其中字符a的个数等于字符c的个数,字符b的个数小于他们的个数。例如aaabbccc, AAABCCC等。求一个字符串中最长的双节棍字符串。
思路:
找出该字符串中每个字符出现了多少次,判断其中双节棍字符串,找出长度最大的双节棍字符串。
例如:
AAABBCCC
先计算出每个字符出现了多少次,得到两个数组data[A,B,C]、num[3,2,3]。有num数组可以判断其中有一个双节棍字符串。结合data数组可以确定该双节棍字符串为AAABBCCC。

java程序如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;

public class Main {	
	public static void main(String[] args) {	
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		char[] data = str.toCharArray();
		int size=0;
		for (int i = 1; i < data.length; i++) {
			if (data[i] != data[i - 1]) {
				size++;
			}
		}
		size++;
		char[] data0 = new char[size];
		int[] num0 = new int[size];
		int intdex = 0;
		HashMap<Character, Integer> map = new HashMap<>();
		int num = 1;
		for (int i = 1; i < data.length; i++) {
			if (data[i] == data[i - 1]) {
				num++;
			} else {
				data0[intdex] = data[i - 1];
				num0[intdex] = num;
				intdex++;
				num=1;
			}
		}
		data0[intdex] = data[data.length - 1];
		num0[intdex] = num;
		
		int max=-1;
		int index=-1;
		for (int i = 0; i < num0.length - 2; i++) {
			if (num0[i] > num0[i + 1] && num0[i + 2] > num0[i + 1]) {
				if (max<Math.min(num0[i],  num0[i + 2])) {
					max= Math.min(num0[i],  num0[i + 2]);
					index=i;
				}
			}
		}
				
		if (index>=0) {
			int num2=Math.min(num0[index],num0[index + 2]);
			for (int i = 0; i < num2; i++) {
				System.out.print(data0[index]);
			}
			for (int i = 0; i < num0[index + 1]; i++) {
				System.out.print(data0[index + 1]);
			}
			for (int i = 0; i <num2; i++) {
				System.out.print(data0[index + 2]);
			}
			System.out.println();
		} else {
			System.out.println("NULL");
		}				
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39559604/article/details/82714038
今日推荐