牛客网刷题:Q4小易喜欢的单词(较难)

题目
小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的’B’
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。

输入描述:
输入为一个字符串,都由大写字母组成,长度小于100
输出描述:
如果小易喜欢输出"Likes",不喜欢输出"Dislikes"

示例1
输入
AAA
输出
Dislikes

分析:本题关键:1、如何读取字符串并利用该数据。2、判断字符串是否满足题目所要求的三个条件。

解题思路
1、创建Scanner键盘录入对象,利用.next()获取字符串;获取到字符串后,由于后面的判断都是基于单个字符或字符串中的某两个字符,所以应该把字符串转换为字符数组,利用.toCharArray()的方法。
2、三个特性中第一个和第二个比较容易,第三个是本题的重点。
(1)判断是否为大写字母,用Character.isUpperCase(s[i])方法即可。(本题告诉输入全为大写字母,原则上可以不做判断了)
(2)判断连续相等的字母,每次将前一个与后一个做相等判断即可。
(3)判断子序列,即任意位置起前面出现过的两个字符,在后面就不能出现,可以采取遍历,将出现过的字符添加到一个集合,然后判断后续出现的字符有没有存在于集合中的。

解题代码

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println(islike(scanner.next()) ? "Likes" : "Dislikes");
        scanner.close();
    }

    private static boolean islike(String word) {
        char ws[] = word.toCharArray();                      //字符串转换为字符数组
        Set set = new HashSet<>();
        if(ws.length > 0 && !Character.isUpperCase(ws[0]))   //判断是否为大写字符
            return false;
        for (int i = 1; i < ws.length; i++) {
        	if(!Character.isUpperCase(ws[i]))
                return false;
            if(ws[i] == ws[i - 1])                           //判断是否连续相等
                return false;
            for (int j = i + 1; j < ws.length; ++j){
                if(set.contains(ws[i] + "" +ws[j]))          //判断新出现的字符是否存在于集合
                    return false;
            }
            for (int j = 0; j < i; ++j){
                set.add(ws[j] + "" +ws[i]);                  //将出现过的字符添加到集合
            }
        }
    
        return true;
    }
}

你可能感兴趣的:(牛客网刷题(java))