題目
給定 [a-z],26個英文字母小寫字符串組成的字符串 A 和 B,其中 A 可能存在重復字母,B 不會存在重復字母,現從字符串 A 中按規則挑選一些字母,可以組成字符串B。
挑選規則如下:
-
同一個位置的字母只能挑選一次
-
被挑選字母的相對先后順序不能被改變
求最多可以同時從 A 中挑選多少組能組成 B 的字符串。
輸入描述
輸入為 2 行,第 1 行輸入字符串 A,第 2 行輸入字符串 B,行首行尾沒有多余空格,其中:
-
A、B 均由 [a-z] 26個英文小寫字母組成
-
0 < A.length < 100,A 中可能包含重復字母
-
0 < B.length < 10,B 中不會出現重復字母
輸出描述
輸出 1 行,包含 1 個數字,表示最多可以同時從 A 中挑選多少組能組成 B 的字符串
行末沒有多余空格
備注
無需驗證輸入格式和輸入數據合法性
用例
用例一:
輸入:
badc
bac
輸出:
1
用例二:
輸入:
badc
abc
輸出:
0
用例三:
輸入:
aabbcxd
abcd
輸出:
1
題解:
import java.util.*;
public class demo01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 讀取輸入的兩個字符串String parent = sc.nextLine(); // 父字符串String child = sc.nextLine(); // 子字符串int length = parent.length();// matched數組用于記錄parent中每個字符是否已被匹配過int[] matched = new int[length];int count = 0; // 計算子序列出現次數for (int i = 0; i < length; ) { // 遍歷父字符串int j = 0; // 子字符串的索引while (i < length && j < child.length()) { // 嘗試匹配if (parent.charAt(i) == child.charAt(j) && matched[i] == 0) { // 如果字符匹配且未被標記matched[i] = 1; // 標記當前字符j++; // 移動子字符串指針}i++; // 移動父字符串指針}if (j == child.length()) { // 如果子字符串完全匹配count++; // 增加計數i = -1; // 重置i,以便從頭開始新的匹配}}System.out.println(count); // 輸出最終計數}
}