西北工业大学ACM基地2022年大培训试题题解:第四周C题

问题描述

问N个字符串中字典序最小的字符串的编号是多少

字符串编号为1到N

输入

第一行输入一个正整数N

接下来的N行每行一个字符串S

1<=N<=100

1<=|S|<=1000

输出

输出字典序最小的字符串的编号,若有多个字符串符合条件,则将编号全部输出并且按照从小到大顺序输出

比如有两个符合条件则输出两行

输入样例 1

4
aa
ab
aa
cb

输出样例 1

1
3

题解

利用string类函数compare()比较字典序。

compare()函数

String.Compare 方法 (System) | Microsoft Learn

Basic_string 类模板既提供了 >、<、==、>=、<=、!= 等比较运算符,还提供了 compare() 函数,其中 compare() 函数支持多参数处理,支持用索引值和长度定位子串进行比较。该函数比较两个指定的 String 对象,并返回一个指示二者在排序顺序中的相对位置的整数。

重载

Compare(String, Int32, String, Int32, Int32, CultureInfo, CompareOptions) 对两个指定String 对象的子字符串进行比较,使用指定的比较选项和区域性特定的信息来影响比较,并返回一个整数,该整数指示这两个子字符串在排序顺序中的关系。
Compare(String, Int32, String, Int32, Int32, Boolean, CultureInfo) 比较两个指定的String 对象(其中忽略或考虑其大小写,并使用区域性特定的信息干预比较),并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, Int32, String, Int32, Int32, StringComparison) 使用指定的规则比较两个指定的String 对象的子字符串,并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, Int32, String, Int32, Int32, Boolean) 比较两个指定的String 对象的子字符串(忽略或考虑其大小写),并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, Int32, String, Int32, Int32) 比较两个指定的String 对象的子字符串,并返回一个指示二者在排序顺序中的相对位置的整数。
Compare(String, String) 比较两个指定的String 对象,并返回一个指示二者在排序顺序中的相对位置的整数。
Compare(String, String, Boolean, CultureInfo) 比较两个指定的String 对象(其中忽略或考虑其大小写,并使用区域性特定的信息干预比较),并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, String, StringComparison) 使用指定的规则比较两个指定的String 对象,并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, String, Boolean) 比较两个指定的String 对象(其中忽略或考虑其大小写),并返回一个整数,指示二者在排序顺序中的相对位置。
Compare(String, String, CultureInfo, CompareOptions) 对两个指定的String 对象进行比较,使用指定的比较选项和区域性特定的信息来影响比较,并返回一个整数,该整数指示这两个字符串在排序顺序中的关系。

注解

Compare 方法的所有重载返回一个 32 位有符号整数,指示两个比较数之间的词法关系。

“值” 条件
小于零 在排序顺序中,第一个子字符串在第二个子字符串之前。
子字符串在排序顺序中出现的位置相同或length 为零。
大于零 第一个子字符串在排序顺序中后跟第二个子字符串。

源代码

// UOJ W4-C
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(void)
{
    string strc, strm;
    vector<string> sv;
    int n = 0;
    cin >> n;
    for (int i = 0; i <= n - 1; i++) //读取所有字符串
    {
        cin >> strc;
        sv.push_back(strc);
    }
    strm = sv[0];
    for (int i = 0; i <= n - 1; i++)
    {
        strc = sv[i];
        if (strm.compare(strc) > 0)
            strm = strc;
    }
    for (int i = 0; i <= n - 1; i++)
    {
        if (strm == sv[i])
            cout << i + 1 << endl;
    }
    // cout << strc << endl;
    return 0;
}

分析

复杂度:空间 $O\left(n\right)$ 时间 $O\left(3n\right)$

评测结果:时间 5ms 内存 4MB

另解

比较字符串的字典序有3种常用方法,分别使用strcmp() 函数、compare() 函数或比较预算符<。此处使用了第二种方法,其他方法可见下文。

参考资料

字典序_兰亭落雪的博客-CSDN博客_字典序

Last modification:December 9, 2022
如果觉得我的文章对你有用,请随意赞赏~