题目描述

小红拿到了一个字符串,她想知道这个字符串能否通过重新排列组成“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;
    }

}

代码未必是最优解

最后修改:2023 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏