---
# System prepended metadata

title: 字串綜合練習
tags: [apcs, 找規律, 歷屆練習, 字串, 自主學習, 解題筆記]

---

###### tags: `apcs` `解題筆記` `歷屆練習` `自主學習`
字串綜合練習
===
{%hackmd BJrTq20hE %}
[TOC]
## StringBuilder使用時機
當有很多答案要輸出時，用StringBuilder存起來一次輸出會比每次都輸出快很多。
## String/StringBuilder語法
```java=
//建立
String s = new String();
String[] d = new String[20];
StringBuilder ans = new StringBuilder();
//存放
s = "1 2 3";
d = s.split(" ");//d[0] = 1，d[1] = 2，d[2] = 3
ans.append("12345");
//取值
String t = s.charAt(0);//t = "1"
t = d[1];//t = "2"
t = ans;//t = "12345"
```
## [歷屆：交錯字串](https://zerojudge.tw/ShowProblem?problemid=c462)
###### tags: `字串` `找規律`
### 題目簡述
輸入整數k與字串s，尋找s裡面最長的k交錯字串長度。
k交錯字串：大小寫以長度為k的規律呈現，如1：aAbBcC(一個字母也算)；2:aaBBcc；3:aaaBBBccc。
### 解法
![](https://i.imgur.com/TeafpO2.jpg)

```java=
import static java.lang.System.*;
import java.util.Scanner;
public class zj_c462 {
	public static void main(String[] args) {
		//輸入
		Scanner br = new Scanner(in);
		int k = br.nextInt();
		String ss = br.nextLine();
		ss = br.nextLine();
		//轉成true false
		boolean[] s = new boolean[ss.length()];
		for(int i = 0;i < ss.length();i++) {
				s[i] = (ss.charAt(i)>= 'A' && ss.charAt(i)<= 'Z');
		}
		//t=數量
		//temp=現在這條交錯字串的長度
		int t = 1,ans = k==1?1:0,temp = 0;
		//k=1時例外處理，每一條轉換字串就加
		if(k == 1) {
			for(int i = 1;i < s.length;i++) {
				//如果跟前一個不同代表換了，加
				if(s[i-1] != s[i])
					temp++;
				//一樣就斷裂 重算
				else
					temp = 1;
				//刷新最大值
				if(temp>ans)
					ans = temp;
			}
		}
		else {
			for(int i = 1;i < s.length ;i++) {
				//跟前面一樣 算數量
				if(s[i-1] == s[i]) {
					t++;
					//有k長度的時候加然後刷新最大值
					if(t == k) {
						temp += k;
						if(temp>ans) {
							ans = temp;
						}
					}
					//超過就斷裂 重算
					if(t>k) {
						temp = k;
					}
				}
				//不同的話看前面長度有沒有到k,不是就斷裂，重算 是的話t從一開始算
				else {

					if(t<k) {
						temp = 0;
					}
					t = 1;
				}
			}
			
		}
		out.println(ans);
	}

}
```



