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

题目

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

解答

首先,要弄清楚什么是变位词。变位词就是组成的字母相同,但顺序不一样的单词。 比如说: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;
}

 

时间: 2024-08-02 03:03:19

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

c c++-写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址

问题描述 写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址 写一个函数判断输入的字符串是否是一个点分十进制格式的IP地址 解决方案 #include ""winsock2.h""#pragma comment(libws2_32.lib"")BOOL CheckIsValidIP(const char* sIP){ unsigned long ulAddress = inet_addr(sIP); if (INADDR_NONE ==

写一个函数找到给定字符串的位置

题目 给你一个排好序的并且穿插有空字符串的字符串数组,写一个函数找到给定字符串的位置. 例子:在字符串数组 ["at", "", "", "", "ball", "", "", "car", "","", "dad", "", ""] 中找到&quo

php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名

写一个PHP函数,实现扫描并打印出自定目录下(含子目录)的所有jpg文件名的方法 <?php $dir = "E:\照片\\"; //打印文件夹中所有jpg文件 function printJpg($dir,$deep = ""){ $dirSource = dir($dir); while($d = $dirSource->read()){ if($d == "." || $d == ".."){ continu

《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉想到用二进制的位运算.最后写出来是一个迭代的过程. 每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1 然后处理进位问题,相当于计算与运算,得到res2 那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1) 因为res2做左移,总会减小到

一家面试公司的机试题,写一个函数,要求输入大于零的整数,返回大写字母序列

问题描述 例如:1返回A 26返回Z27返回AA 53返回BA676返回ZZ 677返回AAA以此类推..咋一看很简单,可越想越复杂感觉,现在头都有些昏了,只好寻求帮助了,谢谢! 问题补充:sandzhang 写道 解决方案 public class Test2{ public static final Integer MODEL_NUMBER = 26; public static char queryString(final int number) { if (number <= MODEL

从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写字母。

#include<iostream> #include<vector> #include<string> using namespace std; int main() { string word; vector<string> Str; while(cin>>word) Str.push_back(word); for(auto c:Str) { cout<<c<<" "; for(auto &

c-一般情况下,应该多个函数放一个文件里,还是一个函数放到一个文件里

问题描述 一般情况下,应该多个函数放一个文件里,还是一个函数放到一个文件里 我非科班出身,也从来没读过改内容. 也许是因为书读的不仔细? 解决方案 对于java来说,一个文件一个类(public的类) 多个函数放一个文件里还是一个函数放一个文件里取决于这些函数的相关性.好比你写作文是一句话一个段落还是一个段落好几句话,这个要灵活掌握,老师没法教你. 你去看windows.linux.jdk.mfc等等的源代码,你会发现这个问题根本就不算一个问题. 解决方案二: 我觉得学习应该有3个阶段 模仿 -

《Python数据科学指南》——1.14 返回一个函数

1.14 返回一个函数 在这节里,我们讨论在一个函数里返回另一个函数. 1.14.1 准备工作 我们举一个高中的例子来说明咱们使用返回一个函数的函数.我们要解决的问题是:给定半径,求出不同高度的圆柱体的容积. 请参见:http://www.mathopenref.com/cylindervolume.html. Volume = area height = pi r^2 * h 上面的公式可以准确地求出圆柱体的体积. 1.14.2 操作方法 我们写一个简单的函数来演示在函数中返回函数的概念,此外

CareerCup之1.4判断字符串是否为变位词

[题目] 原文: 1.4 Write a method to decide if two strings are anagrams or not. 译文: 写一个函数判断两个字符串是否是变位词. [分析] 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词.该题目有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了. The eyes