题目描述
小红拿到了一个字符串,她想知道这个字符串能否通过重新排列组成“Baidu”字符串?
注:大小写必须完全相同,共有t组询问。
输入描述
第一行输入一个正整数t,代表询问次数
接下来的t行,每行输入一个仅包含英文字母的字符串
所有字符串的长度之和保证不超过200,000
输出描述
对于每次询问,输出一行答案。如果可以通过重新排列组成“Baidu”。则输出“Yes”,否则输出“No”。
示例
示例输入
4
Baidu
baidu
Baidu
udiaB
示例输出
Yes
No
Yes
Yes
解题思路
通过题目可知,输入一共有1+t
行,1代表输入的t(int类型),t代表要输入多少条数据(用英文data代表数据)。要判断data里面的字母是否满足,可以拼凑成Baidu。
从每一个data
下手,遍历data
,拿示例输入udiaB
做测试,遍历第一个为u,然后去“Baidu”中查找是否有u,如果没有的话,可以直接宣布结果为false,如果有的话,把“Baidu”的u删除,字符串“Baidu”将变为“Baid”。然后进行下一次遍历,到字母d,从“Baid”中查找是否有d,如果没有,return false
,如果有,删除,继续遍历……
需要注意的几个点:
- 字符串可以无限打乱,只要字母都有“Baidu”这五个就可以
- 原题很简单,“Baidu”没有任何重复的字母,所以直接用
string.replace("str1","str2")
的方式就可以做到删除,我考虑到题目升级的可能性,假如目标字符串并非没有任何重复,而是“Butter”这种有重复字母的,就不能用replace了 - 如果在字符串中查询一个字母的时候,用到的方法是
contains
,如果结果为false
,直接就可以return false
,省去之后的步骤(包括循环遍历)
代码
package com.domcer;
import java.util.Scanner;
/**
* @author hang.wang
*/
public class StringQuery {
private static final Scanner SCANNER = new Scanner(System.in);
private static final String TARGET = "Baidu";
public static void main(String[] args) {
int numT = SCANNER.nextInt();
String[] data = new String[numT];
for (int i = 0; i < data.length; i++) {
data[i] = SCANNER.next();
}
for (String d : data) {
System.out.println(getAdaptation(d));
}
}
public static boolean getAdaptation(String data) {
String target = TARGET;
for (int i = 0; i < data.length(); i++) {
String s = String.valueOf(data.charAt(i));
if (!target.contains(s)) {
return false;
}
int index = target.indexOf(s);
target = target.substring(0,index) + target.substring(index+1);
}
return true;
}
}
代码未必是最优解
1 条评论
菩萨好