zoukankan      html  css  js  c++  java
  • 回文

    回文:正反读都一样的单词或者短语

    Version 1

    bool IsPalindrome(string input) {
    for(int k = 0; k < input.size() / 2; ++k)
        if(input[k] != input[input.length() - 1 – k])
            return false;
        return true;
    }    

    Version 2 (使用STL)

    bool IsPalindrome(string input) {
        string reversed = input;
        reverse(input.begin(), input.end());
        return reversed == input;
    }

    以上代码需要创建副本,所以效率会降低。

    Version 3 (使用STL)

    bool IsPalindrome(string input) {
      return equal(input.begin(), input.begin() + input.size() / 2,
      input.rbegin());
    }

    Version 3可以很好的完成任务,现在我们加上对字符的判断(是否为字母,并且转换字母的大小写):

    bool IsPalindrome(string input) {
        input.erase(remove_if(input.begin(), input.end(), IsNotAlpha), input.end());
        transform(input.begin(), input.end(), input.begin(), ::toupper);
        return equal(input.begin(), input.begin() + input.size() / 2, input.rbegin());
    }

    以上是基于字母的回文,下面我们队单词回文的情况进行分析,可以分为3步:

      1. 把除去字母和空格的其他字符去掉,并转换成统一的大小写;

      2. 把输入转化成一个word的list;

      3. 判断这个list是否正反一致。

    bool IsNotAlphaOrSpace(char ch) {
        return !isalpha(ch) && !isspace(ch);
    }
    
    bool IsWordPalindrome(string input) {
        input.erase(remove_if(input.begin(), input.end(), IsNotAlphaOrSpace), input.end());
        transform(input.begin(), input.end(), input.begin(), ::toupper);
    stringstream tokenizer(input); vector
    <string> tokens;
    tokens.insert(tokens.begin(), istream_iterator
    <string>(tokenizer), istream_iterator<string>()); return equal(tokens.begin(), tokens.begin() + tokens.size() / 2, tokens.rbegin()); }

     (以上参考CS106L Course Reader Chapter 7:STL Algorithms)

    下面是一个倒序输出英文句子单词的实现:

    /**
     *  给定一个英文的句子,倒序输出其中的单词,字符串只包含字母和空格
     *  比如"My name is Han Meimei", 输出"Meimei Han is name My"
     */
    
    #include <iostream>
    #include <cctype>
    #include <cstring>
    using namespace std;
    
    bool IsSpace(char ch) {
        return isspace(ch);
    }
    
    void revert(const char* source) {
        int length = strlen(source);
        int l = 0;
    
        for(int i = length - 1; i >= -1; --i) {
            if(IsSpace(*(source + i)) || i == -1){
                for(int j = 1; j <= l; ++j){
                    cout<<*(source + i + j);
                }
                if(i != -1) cout<<' ';
                l = 0;
            }
            else ++l;
        }
        cout<<endl;
    }
    
    int main() {
        const char* source = "My name is Han Meimei";
    
        revert(source);
    
        return 0;
    }

    另一种思路:如果结果需要存储的话,把每个单词都逆序,再把整个句子逆序就可以(或者先逆序整个句子,再逆转每一个单词)

  • 相关阅读:
    CF708B
    P4308 [CTSC2011]幸福路径
    P3631 [APIO2011]方格染色
    P1436棋盘分割 记忆化搜索解法
    P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
    P2743(poj1743) Musical Themes[差分+后缀数组]
    BZOJ3230 相似子串[后缀数组+二分+st表]
    hdu3518 Boring Counting[后缀排序]
    Robot Framework自动化_Selenium2Library 关键字
    Robot Framework自动化_环境搭建以及第一个用例
  • 原文地址:https://www.cnblogs.com/mess4u/p/3081061.html
Copyright © 2011-2022 走看看