網易筆試編程-小易喜歡的單詞

題目描述:
小易喜歡的單詞具有以下特性:
1.單詞每個字母都是大寫字母
2.單詞沒有連續相等的字母
3.單詞沒有形如“xyxy”(這裏的x,y指的都是字母,並且可以相同)這樣的子序列,子序列可能不連續。
例如:
小易不喜歡”ABBA”,因爲這裏有兩個連續的’B’
小易不喜歡”THETXH”,因爲這裏包含子序列”THTH”
小易不喜歡”ABACADA”,因爲這裏包含子序列”AAAA”
小易喜歡”A”,”ABA”和”ABCBA”這些單詞
給你一個單詞,你要回答小易是否會喜歡這個單詞。
輸入描述:
輸入爲一個字符串,都由大寫字母組成,長度小於100
輸出描述:
如果小易喜歡輸出”Likes”,不喜歡輸出”Dislikes”
輸入例子:
AAA
輸出例子:
Dislikes
問題分析:
小易喜歡的單詞具有三個特徵(或者說條件)
1.單詞的每個字母都要大寫
2.單詞沒有連續相等的字母
3.單詞沒有形如“xyxy”(這裏的x,y指的都是字母,並且可以相同)這樣的子序列,子序列可能不連續。
那我們的做法是分別定義這三個條件函數,只有當這三個條件都滿足的時候,輸出Likes,否則輸出Dislikes。
對於條件1,我們定義函數conditon1(string str),用來判斷每個字母是否是大寫。做法就是遍歷字符串中的字符,只有當所有的字符都是大寫的時候,返回true,否則返回false。
對於條件2,我們定義函數condition2(string str),用來判斷相鄰兩個字符是否相等 。做法是遍歷字符串中的字符,判斷當前字符和下一個字符是否相等,只有遍歷完所有字符的時候,返回true,否則返回false。這裏需要注意的是,當前字符要和它的下一個字符進行比較,所以只需要遍歷到倒數第二個字符爲止就行。
對於條件3,我們定義函數condition3(string str),用來判斷沒有形如“xyxy”的子序列。因爲子序列是形如xy或xx的,所以,子序列只有兩個字符,我的做法是兩層循環第一層循環是遍歷字符串中的字符,第二層循環是從第一層循環中字符的下一個字符開始,雙層循環內部是流程是首先保存這兩個字符組成一個新的字符串,然後得到第二層循環所指向的以下一個字符爲開頭的字符串所能組成的所有子序列,將這個新的字符串與所有子序列進行比較,判斷是否相等,如果都不相等,繼續循環,直到循環停止,返回滿足條件;如果有相等,則循環停止,返回不滿足條件。
在主函數中,我將這三個條件用邏輯與連接,如果都滿足,返回Likes,否則返回Dislikes。
程序代碼如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

bool condition1(string str);
bool condition2(string str);
bool condition3(string str);
bool comStr(string one, string ones);
int main(void)
{
    string str;
    while(cin >> str)
    {
        if (condition1(str) && condition2(str) && condition3(str))
            cout << "Likes" << endl;
        else
            cout << "Dislikes" << endl;
    }
}

bool condition1(string str)
{
    bool flag = true;
    for(unsigned int i = 0; i < str.size(); ++i)
    {
        if (str[i] >= 'A' && str[i] <= 'Z')
        {
            flag = true;
        }
        else
        {
            flag = false;
            break;
        }
    }
    return flag;
}

bool condition2(string str)
{
    bool flag = true;
    for (unsigned int i = 0; i < str.size() - 1; ++i)
    {
        if (str[i] != str[i + 1])
        {
            flag = true;
        }
        else
        {
            flag = false;
            break;
        }
    }
    return flag;
}

bool condition3(string str)
{
    vector<string> subStr;
    bool flag = true;
    for (unsigned int i = 0; i < str.size() - 1; ++i)
    {
        for (unsigned int j = i+1; j < str.size(); ++j)
        {
            string tempStr;
            tempStr.push_back(str[i]);
            tempStr.push_back(str[j]);
            if (false == comStr(tempStr, str.substr(j+1)))
            {   flag = false;
                break;
            }
        }
        if (false == flag)
        {
            flag = false;
            break;
        }
    }
    return flag;
}

bool comStr(string one, string ones)
{
    bool flag = true;
    vector<string> vecStr;
    if (!ones.empty())
    {
        for (unsigned int i = 0; i < ones.size(); ++i)
        {
            for (unsigned int j = i + 1; j < ones.size(); ++j)
            {
                string str;
                str.push_back(ones[i]);
                str.push_back(ones[j]);
                vecStr.push_back(str);
            }
        }
    }
    for (unsigned int i = 0; i < vecStr.size(); ++i)
    {
        if (one == vecStr[i])
        {
            flag = false;
            break;
        }
        else
        {
            flag = true;
        }
    }
    return flag;
}

若有不對之處,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章