2017网易---小易喜欢的单词

题目描述

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

输入描述:

输入为一个字符串,都由大写字母组成,长度小于100

输出描述:

如果小易喜欢输出"Likes",不喜欢输出"Dislikes"
示例1

输入

AAA

输出

Dislikes

题目链接:https://www.nowcoder.com/practice/ca7b8af83e2f4ec1af2f23d6733223b5?tpId=85&tqId=29845&tPage=1&rp=1&ru=/ta/2017test&qru=/ta/2017test/question-ranking

法一:四层for循环。对于三个规则,分别进行判定,因为数据不大,所以没有超时。o(n^4)。代码如下(耗时40ms):
 1 public class Main {
 2 
 3     public static void main(String[] args) throws IOException {
 4         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 5         String line = in.readLine();
 6         int len = line.length();
 7         boolean flag = true;
 8         for(int i = 0; i < len; i++) {
 9             //验证第一个规则,大写字母
10             if(line.charAt(i) < 'A' || line.charAt(i) > 'Z') {
11                 flag = false;
12                 break;
13             }
14             //验证第二个规则,没有连续相同的字符
15             else if(i + 1 < len && line.charAt(i) == line.charAt(i + 1)) {
16                 flag = false;
17                 break;
18             }
19             for(int j = i + 1; j < len; j++) {
20                 for(int t = j + 1; t < len; t++) {
21                     for(int k = t + 1; k < len; k++) {
22                         //验证第三个规则,没有THTH类似的子序列
23                         if(line.charAt(i) == line.charAt(t) && line.charAt(j) == line.charAt(k)) {
24                             flag = false;
25                             break;
26                         }
27                     }
28                     if(flag == false) {
29                         break;
30                     }
31                 }
32                 if(flag == false) {
33                     break;
34                 }
35             }
36             if(flag == false) {
37                 break;
38             }
39         }
40         if(flag == false) {
41             System.out.println("Dislikes");
42         }
43         else {
44             System.out.println("Likes");
45         }
46     }
47 
48 }
View Code

法二(借鉴):正则表达式,厉害了。不过看都看不懂,先留着。代码如下(耗时22ms):

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 
 5 public class Main {
 6 
 7     public static void main(String[] args) throws IOException {
 8         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 9         String line = in.readLine();
10         if(isAllUpCase(line) && isConEql(line) && isThrEql(line))
11             System.out.println("Likes");
12         else
13             System.out.println("Dislikes");
14     }
15         //条件1
16     public static boolean isAllUpCase(String word){
17        return word.matches("[A-Z]+");
18     }
19     //条件2
20     public static boolean isConEql(String word){
21        return !word.matches(".*(.)(\1).*");
22     }
23     //条件3
24     public static boolean isThrEql(String word){
25        return !word.matches(".*(.).*(.)(.*\1)(.*\2).*");
26     }
27 
28 }
View Code
原文地址:https://www.cnblogs.com/cing/p/8615257.html