1. 程式人生 > >輸出一個字串中最長的雙節棍字串

輸出一個字串中最長的雙節棍字串

形似如同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"); } } }