写一个函数对字符串数组排序,使所有变位词都相邻

简介: 题目 写一个函数对字符串数组排序,使得所有的变位词都相邻。 解答 首先,要弄清楚什么是变位词。变位词就是组成的字母相同,但顺序不一样的单词。 比如说:live和evil就是一对变位词。OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了。

题目

写一个函数对字符串数组排序,使得所有的变位词都相邻。

解答

首先,要弄清楚什么是变位词。变位词就是组成的字母相同,但顺序不一样的单词。 比如说:live和evil就是一对变位词。OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了。它要求我们在排序的过程中,按照变位词的准则来排序。 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数。 一般情况下我们如果要排序一个长度为n的数组A,我们可以这样调用sort:

sort(A, A+n);

但如果我们有一个数组P,里面每个元素都是一个结构体:person,我们想按照person 这个结构体中年龄age来排序,这时候我们就需要自己写一个对比函数cmp:

bool cmp(person p1, person p2){
    return p1.age < p2.age; 
}

然后这样调用sort函数:

sort(P, P+n, cmp);

OK,回到我们的题目,我们的对比函数需要将两个串先按字典序排序,然后再比较, 这样一来,变位词经过字典序排序后就是一样的了。当调用sort函数时将会被排在一起。

代码如下:

#include <iostream>
#include <algorithm>
using namespace std;

bool cmp(string s1, string s2){
    sort(s1.begin(), s1.end());
    sort(s2.begin(),s2.end());
    return s1 < s2;
}
int main(){
    string s[] = {
        "axyz", "abc", "yzax", "bac", "zyxa", "fg", "gf"
    };
    sort(s, s+7, cmp);
    for(int i=0; i<7; ++i)
        cout<<s[i]<<endl;
    return 0;
}

 

相关文章
|
4月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
存储 C语言
【03】逆序数组
【03】逆序数组
|
2月前
|
人工智能
数组逆序
数组逆序
19 3
|
3月前
|
算法 测试技术 C#
C++二分查找或并集查找:交换得到字典序最小的数组
C++二分查找或并集查找:交换得到字典序最小的数组
|
3月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
42 0
|
4月前
|
存储 编译器 C语言
Day2 排序子序列、倒置字符串
Day2 排序子序列、倒置字符串
26 0
|
5月前
|
算法 程序员
倒置字符串
倒置字符串
|
7月前
逆序一个字符串的每一组单词(不是倒叙)
整体思路: 1.先将整个字符串倒叙:i like china.->.anihc ekil i 2.将倒叙后的每一块单词再倒叙:.anihc->china. 想必大家都发现了,倒叙整个字符串和倒叙每一块是一样的,那么我们不妨写一个倒叙的函数在这里用reserve表示!
31 0
|
9月前
|
C语言 容器
互换函数和反转字符串
互换函数和反转字符串
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。
476 0

热门文章

最新文章