使用循环的字典字符串比较

Posted

技术标签:

【中文标题】使用循环的字典字符串比较【英文标题】:Lexicographical string comparison using loops 【发布时间】:2019-10-09 05:16:43 【问题描述】:

我想按字典顺序比较两个长度相等且包含拉丁字母的字符串。大写和小写字母被认为是相同的。

这是我的代码:

string in1,in2;
    getline(cin,in1);
    getline(cin,in2);
    int l=in1.length();

    for(int i=0;i<l;++i)
        in1[i]=tolower(in1[i]);
        in2[i]=tolower(in2[i]);
    

    int sum1=0;
    int sum2=0;
    for(int i=0;i<l;++i)
        sum1=sum1 + int(in1[i]);
        sum2=sum2 + int(in2[i]);
    
    if(sum1==sum2)
        cout<<"0"<<endl;
    if(sum1<sum2)
        cout<<"-1"<<endl;
    if(sum1>sum2)
        cout<<"1"<<endl;

但是,这会在某些测试条件下产生错误。

这里有什么问题?

【问题讨论】:

【参考方案1】:

你可以使用比较功能

int x = in1.compare(in2);
if(x == 0)
     cout<<"Both are Equal";
else if (x > 0) 
    cout << in1 << " is greater than "<< in2 << endl; 
else
    cout << in2 << " is greater than "<< in1 << endl; 

【讨论】:

很快,在 C++20 中,auto x = in1 &lt;=&gt; in2 :)【参考方案2】:

我认为它是错误的,因为它没有考虑字符的顺序。例如“ab”和“ba”将得到相同的总和。

【讨论】:

很好地剖析了这个问题。为了使这成为一个好的答案,您应该提供一个解决方案。【参考方案3】:

您可以将strcmpstd::string C 字符串提取器c_str() 一起使用。这是一个完整的工作解决方案:

#include <iostream>
#include <string>
#include <string.h>

int main(int argc, char **argv)

    std::string s1("aabad");
    std::string s2("abaaaaaaa");
    if (strcmp(s1.c_str(),s2.c_str()) <  0) std::cout << "s1 <  s2\n";
    if (strcmp(s1.c_str(),s2.c_str()) >  0) std::cout << "s2 <  s1\n";
    if (strcmp(s1.c_str(),s2.c_str()) == 0) std::cout << "s1 == s2\n";
    return 0;

【讨论】:

【参考方案4】:

您当然可以使用标准库为std::string 类型提供的运算符:

operator==
operator!=
operator<             lexicographically compares two strings
operator>             (function template)
operator<=
operator>=

有关详细信息,请参阅here。

【讨论】:

以上是关于使用循环的字典字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 1537E2 Erase and Extend (Hard Version)(扩展KMP-比较两个前缀无限循环后的字典序大小)

按字典顺序比较字符串

字符串的字典比较[不区分大小写]

C# 实现一个基于值相等性比较的字典

流程控制及循环控制等

字符串字典序