首页 > 试题广场 >

小易喜欢的单词

[编程题]小易喜欢的单词
  • 热度指数:18454 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。

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


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

输入

AAA

输出

Dislikes
示例2

输入

AbAB

输出

Dislikes
示例3

输入

ABACADA

输出

Dislikes
示例4

输入

AEBFCEDF

输出

Dislikes
import java.util.Scanner;
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String word = sc.next();
            
            if(isAllUpCase(word) && isConEql(word) && isThrEql(word))
                System.out.println("Likes");
            else
                System.out.println("Dislikes");
        }
    }
    //条件1
     public static boolean isAllUpCase(String word){
        return word.matches("[A-Z]+");
    }
    //条件2
    public static boolean isConEql(String word){
        return !word.matches(".*(.)(\\1).*");
    }
    //条件3 
    public static boolean isThrEql(String word){
        return !word.matches(".*(.).*(.)(.*\\1)(.*\\2).*");
    }
}

编辑于 2016-08-18 17:17:52 回复(28)
主要是第二种的判断,可以将任意一个字符出现的起止位置看做一个线段(start,end);
将线段放入集合中,判断是否有交叉的线段,有则说明存在重复的子序列(子序列长度为2).
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> type;

int hasubseq(string &str){
    set<type> seg;	// pair(start,end)
    unordered_set<char> hash;
    for(int i=0;i<str.length();++i){
        if (hash.find(str[i])!=hash.end()) continue;
        hash.insert(str[i]);
        for(int j=str.length()-1;j>i;--j){
            if (str[i]!=str[j]) continue;
            for(set<type>::iterator it=seg.begin();it!=seg.end();++it){
                if (it->second > i && it->second < j) return 1;
                if (it->first > i && it->first < j) return 1;
            }
            seg.insert(make_pair(i,j));
            break;            
        }        
    }
    return 0;
}
int main(){
    for(string str;cin>>str;){
        int flag=1;
        if(flag){	// ABBA
            for(int i=1;i<str.length();++i){
                if (str[i]==str[i-1]){
                    cout<<"Dislikes"<<endl;
                    flag=0;
                    break;
                }
            }
        }
        if (flag){	// THETXH
            if (hasubseq(str)){
                cout<<"Dislikes"<<endl;
                flag=0;
            }
        }
        if (flag){	// ABACADA
            map<char,int> m;
            for(int i=0;i<str.length();++i){
                m[str[i]]++;
                if (m[str[i]]>3){
                    cout<<"Dislikes"<<endl;
                    flag=0;
                    break;
                }
            }
        }
        if (flag) cout<<"Likes"<<endl;
    }
    return 0;
}

编辑于 2016-08-09 13:31:33 回复(4)
#include<iostream>
#include<string>
using namespace std;
bool f(string str)//判断连续重复
{
    for(int i = 0; i < str.length() - 1; i++)
    {
        if(str[i] == str[i+1])
            return true;
    }
    return false;
}
bool g(string str)//判断重复子序列
{
    int array[26][3] = {0};
    //26行3列,26行为26个字母
    //第一列为字母出现次数
    //第二列为字母首次出现位置
    //第三列为字母末次出现位置
    for(int i = 0; i < str.length(); i++)
    {
        array[str[i]-'A'][0]++;
        array[str[i]-'A'][2] == i;
        if(array[str[i]-'A'][1] == 0)
            array[str[i]-'A'][1] = i;
    }
    for(int i = 0; i < 26; i++)
    {
        if(array[i][0] >= 4)//有出现四次以上的不满足
            return true;
    }
    for(int i = 0; i < 26; i++)
    {
        for(int j = i + 1; j < 26; j++)
        {
            //若存在两个字母,首次出现位置与末次出现次数均满足小于关系
            if((array[i][1] < array[j][1]) && (array[i][2] < array[j][2]))
                return true;
        }
    }
    return false;
}

int main()
{
    string str;
    cin >> str;
    if(f(str) || g(str))
        cout << "Dislikes" << endl;
    else
        cout << "Likes" << endl;
}

编辑于 2018-09-13 22:25:55 回复(5)
import sys
import re

if __name__ == "__main__":
    pattern1 = re.compile(r"[^A-Z]+")
    pattern2 = re.compile(r"([A-Z])\1")
    pattern3 = re.compile(r"([A-Z])[A-Z]*([A-Z])[A-Z]*\1[A-Z]*\2")
    
    word = sys.stdin.readline()
    word = word.rstrip('\n')
    if pattern1.search(word) or pattern2.search(word) or pattern3.search(word):
        print("Dislikes")
    else:
        print("Likes")

直接使用 Python 中的正则表达式匹配,值得注意的是使用 readline 读取的行,默认包含有一个 '\n',必须把这个去掉,否则通过不了所有测试用例。

还有一个使用 C++11 的解答,但是 gcc 的版本必须在 4.9.0 以上才能正常编译运行,供大家参考
#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main() {
  /*regex p1("[^A-Z]+"), p2("([A-Z])\\1"),
      p3("([A-Z])[A-Z]*([A-Z])[A-Z]*\\1[A-Z]*\\2");
  string word;
  while (cin >> word) {
    if (regex_search(word, p1) or regex_search(word, p2) or
        regex_search(word, p3)) {
      cout << "Dislikes\n";
    } else {
      cout << "Likes\n";
    }
  }*/

    regex r("([^A-Z]+|([A-Z])\\2|([A-Z])[A-Z]*([A-Z])[A-Z]*\\3[A-Z]*\\4)");
    string word;
    while(cin >> word){
        if (regex_search(word, r)){
            cout << "Dislikes\n";
        }
        else{
            cout << "Likes\n";
        }
    }
    
  return 0;
}

编辑于 2017-09-05 00:34:43 回复(5)
while(line = readline()){
    var str = line.trim();
    var pattern1 = /[a-z]/; //存在小写字母
    var pattern2 = /(\w)\1/; //存在连续的字母
    var pattern3 = /(\w)\w*(\w)\w*\1\w*\2/; //存在交叉出现的字符
    if(str.match(pattern1) || str.match(pattern2) || str.match(pattern3)){
        console.log('Dislikes');
    }else{
        console.log('Likes');
    }   
}

发表于 2017-08-13 19:39:46 回复(2)
题目的条件3如果改成两个子序列,就比较麻烦了
#include <iostream>
#include <string>
using namespace std;
bool allCaps(string s){
	for(int i=0;i<s.size();i++){
		if(s[i]>'Z'||s[i]<'A'){
			return false;
		}
	}
	return true;
} 
bool isEqual(string s){
	if(s.size()==1) return false;
	for(int i=1;i<s.size();i++){
		if(s[i-1]==s[i]){
			return true;
		}
	}
	return false;
}
bool isSub(string s){
	if(s.size()<4) return false;
	for(int i=0;i<s.size()-3;i++){
		for(int j=i+1;j<s.size()-2;j++){
			for(int k=j+1;k<s.size()-1;k++){
				if((int)s[i]==(int)s[k]){
					for(int l=k+1;l<s.size();l++){
						if((int)s[j]==(int)s[l]){
							return true;
						}
					}
				}
			}
		}
	}
	return false;
}
using namespace std;
int main(){
	string s;
	cin>>s;
	if(!allCaps(s)){
		cout<<"Dislikes"<<endl;
	}else if(isEqual(s)){
		cout<<"Dislikes"<<endl;
	}else if(isSub(s)){
		cout<<"Dislikes"<<endl;
	}else{
		cout<<"Likes"<<endl;
	}
	return 0;
}

发表于 2017-08-24 11:36:01 回复(0)
牛客检测的测试用例有问题,在代码中只需要满足前面两项即可AC;1.判断全部都为大写字母,可以使用正则word.matches("[A-Z]+"),也可以使用编码字符集判断word.charAt(i)>'A' &&<'Z';2.判断有无连续相同的字母,对字符串的每个字符进行遍历,然后与前面或者与后面一个字符进行判断即可
import java.util.Scanner;

public class StringUtil {
	
	//小易喜欢的单词
	public static void main(String[] args){
		
		Scanner in = new Scanner(System.in);
		String str = in.next();
		boolean like = true;
		if(str.matches("[A-Z]+")){
			for(int i=1; i<str.length(); i++){
				if(str.charAt(i) == str.charAt(i-1)){
					like = false;
					break;
				}
			}
			if(like == false){
				System.out.println("Dislikes");
			}
			else{
				System.out.println("Likes");
			}
		}
		else{
			System.out.println("Dislikes");
		}
	}
	
}

发表于 2017-08-31 14:01:40 回复(1)
import re
print('Dislikes') if re.findall(re.compile(r'(.)\1+|(.).*(.).*\1+.*\2+'), input())  else print('Likes')
编辑于 2018-10-07 17:37:02 回复(0)
import re
pattern1 = r'^[A-Z]+$'
pattern2 = r'^[A-Z]*([A-Z])\1[A-Z]*$'
pattern3 = r'^[A-Z]*([A-Z])[A-Z]*([A-Z])[A-Z]*\1[A-Z]*\2[A-Z]*$'
try:
    while True:
        string = input()
        if not re.match(pattern1,string):
            print('Dislikes')
            break
        if re.match(pattern2,string):
            print('Dislikes')
            break
        if re.match(pattern3,string):
            print('Dislikes')
            break
        print('Likes')
except:
    pass

发表于 2018-09-29 16:53:45 回复(0)
//从字符串第一个字母向后判断,写出判断条件,如果Dislikes提前结束,否则判断是否执行到了倒数第二个字母,是输出Likes
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        char[] ch=str.toCharArray();
        int count=0;
        for(int i=0;i<ch.length-1&&ch[i]>='A'&&ch[i]<='Z';i++,count++){
            if(i+1<=ch.length-1&&ch[i]==ch[i+1]||i+3<=ch.length-1&&ch[i]==ch[i+2]&&ch[i+1]==ch[i+3]){
                    System.out.println("Dislikes");
                    break;
            }
        }
        if(count==ch.length-1)
            System.out.println("Likes");
    }
}

发表于 2018-09-10 15:28:20 回复(0)
字符串长度不超过100,直接暴力搜索四重循环了……
<?php
// $file = fopen("input.txt", "r");
$file = STDIN;
$str = trim(fgets($file));

function check1($str) {
    //1.单词每个字母都是大写字母
    for ($i = 0, $len = strlen($str); $i < $len; $i++) {
        if ($str[$i] >= 'A' && $str[$i] <= 'Z') {
            continue;
        }
        return false;
    }
    return true;
}

function check2($str) {
    //2.单词没有连续相等的字母
    for ($i = 0, $len = strlen($str); $i < $len - 1; $i++) {
        if ($str[$i] == $str[$i+1]) {
            return false;
        }
    }
    return true;
}

function check3($str) {
    //3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
    $len = strlen($str);
    if ($len < 4) {
        return true;
    }
    for ($i = 0; $i < $len - 3; $i++) {
        for ($j = $i + 1; $j < $len - 2; $j++) {
            for ($x = $j + 1; $x < $len - 1; $x++) {
                for ($y = $x + 1; $y < $len; $y++) {
                    if($str[$i] == $str[$x] && $str[$j] == $str[$y]) {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

if (check1($str) && check2($str) && check3($str)) {
    echo 'Likes';
} else {
    echo 'Dislikes';
}

发表于 2018-08-10 13:41:56 回复(0)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int bigger(string a)
{
    int cnt = 0;
    int len = a.size();
    for (int i = 0; i<len; ++i)
    {
        if (a[i]>='A'&&a[i]<='Z')
            ++cnt;
    }
    if (cnt == len)
        return true;
    else return false;
}
int equal(string a)
{
    int cnt = 0;
    for (unsigned int i = 1; i < a.size(); ++i)
    {
        if (a[i] == a[i - 1])
            cnt = 1;
    }
        if (cnt == 1)
            return false;
        else return true;
}
int fanfu(string a)
{
    int cnt = 0;
    for (unsigned int i = 0; i < a.size() - 3; ++i)
    {
        for (unsigned int j = i + 2; j<a.size(); ++j)
            if (a[i] == a[j])
            {
                for (unsigned int k = j + 1; k < a.size(); ++k)
                {
                    if (a[k] == a[i + 1])
                        cnt = 1;
                }
            }
    }
    if (cnt == 1)
        return false;
    else return true;

}
int main()
{
    string word;
    while (cin >> word)
    {
        int c1;
        int c2;
        int c3;
        c1 = bigger(word);
        c2 = equal(word);
        c3 = fanfu(word);
        if (c1 == 1 && c2 == 1 && c3 == 1)
            cout << "Likes";
        else cout << "Dislikes" << endl;
    }
}
发表于 2018-05-02 15:23:18 回复(1)
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.next();
        if(isUpper(str) && secJudge(str) && thirdJudge(str)){
            System.out.print("Likes");
        }else{
            System.out.print("Dislikes");
        }
        in.close();
    }
    
    public static boolean isUpper(String str){
        return str.matches("[A-Z]+");
    }
    
    public static boolean secJudge(String str){
        return !str.matches(".*(.)\\1.*");
    }
    
    public static boolean thirdJudge(String str){
        return !str.matches(".*(.).*(.).*\\1.*\\2.*");
    }
}

\1的意思是,和第一个()里的内容相同,注意转义字符的处理并且必须和()配套使用。
\2的用法同理。

编辑于 2018-04-26 19:26:25 回复(0)
import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
            judge(input.next());
        }
    }
    public static void judge(String str){
        char c[]=str.toCharArray();
        char c2[]=str.toCharArray();
        for(int i=0;i<c.length;i++){
            if(!(c[i]>='A'&&c[i]<='Z')||(i<c.length-1&&c[i]==c[i+1])){    //判断是否都是大写字母和ABBA型
                System.out.println("Dislikes");
                return;
            }
        }
        Arrays.sort(c);        //否则进行排序
             StringBuffer buf=new StringBuffer();
        String s=String.valueOf(buf.append(c));
        char c1[]=s.toCharArray();
        for(int i=0;i<c1.length;i++){    //若有连续四个字母相等,说明是xyxy型(字母一样的情况)
            if(i<c1.length-3&&(c1[i]==c1[i+1]&&c1[i+1]==c1[i+2]&&c1[i+2]==c1[i+3]))
                System.out.println("Dislikes");
                return;
        }
        int a=0,b=0;
        boolean flag1=true;
        for(int i=0;i<c2.length;i++){
            if(flag1==false)
                break;
            for(int j=i+1;j<c2.length;j++){        //找到第一次两个字母相同的位置,记下这两个位置
                if(c2[i]==c2[j]){
                    a=i;
                    b=j;
                    flag1=false;
                    break;
                }
            }
        }
        boolean flag=true;
        for(int k=a+1;k<b;k++){        //判断第一个字母后的字母到第二个字母的前一个字母是否有和第二个字母到最后的字母相同的
            for(int m=b+1;m<c2.length;m++){
                if(c2[k]==c2[m]){
                    flag=false;
            }
        }
        if(flag==false){
            System.out.println("Dislikes");
        }else{
            System.out.println("Likes");
        }
    }
}


编辑于 2018-02-02 11:21:11 回复(1)
//咸鱼成长记,C++解法
#include<iostream>
#include<string.h>
#include<ctype.h>
using namespace std;
int main()
{
    int i,j;
    char a[101],sum[26][2]={0};
    gets(a);
    for (i=0;i<strlen(a);i++)
    {
        //条件1
        if (!(isupper(a[i])))
        {
            cout<<"Dislikes";
            return 0;
        }
        //条件2
        if (i!=strlen(a)-1)
        {
            if (a[i]==a[i+1])
            {
                cout<<"Dislikes";
                return 0;
            }
        }
        //为条件3打表
        if (sum[a[i]-'A'][0]==0)
        sum[a[i]-'A'][0]=i;
        else
        sum[a[i]-'A'][1]=i;
    }
    for (i=0;i<25;i++)
    {
        for (j=0;j<25-i;j++)
        {
            //判断条件3
            if ((sum[i][0]<sum[j][0]&&sum[j][0]<sum[i][1]&&sum[i][1]<sum[j][1])||(sum[j][0]<sum[i][0]&&sum[i][0]<sum[j][1]&&sum[j][1]<sum[i][1]))
            {
                cout<<"Dislikes";
                return 0;
            }
        }
    }
    cout<<"Likes";
}
发表于 2018-01-28 23:51:09 回复(1)
#include <bits/stdc++.h>

using namespace std;

bool F1(string s)
{     bool flag = true;     for(int i=0;i<s.length();i++)     {         if(islower(s[i]))         {             flag = false;             return flag;                     }     }     return flag;
}

bool F2(string s)
{     bool flag = true;     for(int i=1;i<s.length();i++)     {         if(s[i]==s[i-1])         {             flag = false;             return flag;         }     }     return flag;
}

bool F3(string s)
{     bool flag = true;     for(int i=0;i<s.length();i++)         for(int j=i+1;j<s.length();j++)             for(int k=j+1;k<s.length();k++)                 for(int p=k+1;p<s.length();p++)                     if(s[i]==s[k] && s[j]==s[p])                     {                         flag = false;                         return flag;                     }     return flag;
}

int main()
{     string s;     cin>>s;     if(F1(s) && F2(s) && F3(s))         cout<<"Likes"<<endl;     else         cout<<"Dislikes"<<endl;     return 0;
}

发表于 2018-01-02 02:15:35 回复(0)
表示这应该是最笨的办法……没办法,我比较笨,要找不到工作了T_T
string = input()
result = 1
if not string.isupper():
    result = 0
else:
    for i in range(len(string)-1):
        if string[i] == string[i+1]:
            result = 0
            break
if len(string) >= 4 and result == 1:
    for i in range(len(string)-3):
        for j in range(i+1, len(string)-2):
            for k in range(j+1, len(string)-1):
                for l in range(k+1, len(string)):
                    if string[i] == string[k] and string[j] == string[l]:
                        result = 0
                        break
                if result == 0:
                    break
            if result == 0:
                break
        if result == 0:
            break
if result == 0:
    print('Dislikes')
else:
    print('Likes')

发表于 2017-12-16 18:23:46 回复(0)
var s = readline();
/[a-z]|(\w)\1/g.test(s) ?  print('Dislikes') : print('Likes');

想看看第三条件怎么写,结果只要满足两个条件就行,跑了一下,还真过了。 O(∩_∩)O哈哈~

发表于 2017-12-13 15:28:10 回复(0)
看到c语言版本的比较少,所以写了一个非常傻瓜的操作,占用内存也不小,仅供初学者参考;
#include<math.h>
#include<stdio.h>

char x[1000],y[1000];
int length;
int i,j,k,w;
int flag;
int main()
{
    scanf("%s",&x);
    for(i=0;i<=1000;i++)
    {
        if(x[i] == 0)
        break;
    }
    length = i;
    flag = 1; 
    printf("%d %d %d\n",x[1],'x[1]','A'); 
    for(i=0;i<length;i++)
    {
        if((x[i] < 'A') &&(x[i] > 'Z'))
            {
            flag = 0;}
        else if(x[i] == x[i+1])
            {
            flag = 0;}
        else
            {for(j=i+1;j<length;j++)
              {
                for(k=j+1;k<length;k++)
                {
                    for(w=k+1;w<length;w++)
                        if(((int)x[i]==(int)x[k])&&((int)x[j]==(int)x[w]))
                           {
                           flag = 0; } 
                        else
                           continue;
                }
              }
            }
    }
    if(flag == 0)
      printf("Dislikes");
    else
      printf("Likes");

}

发表于 2017-12-06 20:40:04 回复(3)
还真的把前面两个问题给写了,就过了,答案有问题看来。
发表于 2017-11-03 14:08:48 回复(0)