UVA-156 Ananagrams

来源:互联网 发布:天天炫舞抽坐骑软件 编辑:程序博客网 时间:2024/05/01 07:27

2016-07-14

UVA - 156 Ananagrams

题目大意:输入一些单词,按字典序顺序输出无视大小写及字母顺序后,只出现一次的单词。如 STOP、SOPT、spTO 算重复出现。

解题思路:保留输入单词,把输入的单词化为小写后对字符串排序,这时候出现字母个数相同的单词会被排成一样,然后遍历查找是否有相同单词,没有的话把对应原单词存于一个二维数组中,对二维数组排序后输出。

注意:在标记不符合条件的单词时要注意。注意标记的变化。

#include <iostream>#include <cstring>#include <stdlib.h>using namespace std;char str[1000][1000];char t[1000][1000];char ans[1000][1000];int num[1000];int n = 0;int temp = 0;int cmp ( const void*a,const void*b ) {    char *_a = (char*)a;    char *_b = (char*)b;    return (*_a - *_b);}int comp ( const void*a,const void*b ) {    char *_a = (char*)a;    char *_b = (char*)b;    return strcmp(_a,_b);}int main() {    memset ( num , 0 , sizeof(num) );    while ( cin >> str[n] && strcmp(str[n],"#") ) {//边输入边将所输入排列的字符串进行处理(排序,全部转换为小写字母)        for (int i = 0; i < strlen(str[n]); i++) {            if ( str[n][i] >= 'A' && str[n][i] <= 'Z' )                t[n][i] = str[n][i] + 'a' - 'A';            else    t[n][i] = str[n][i];        }        qsort ( t[n] , strlen(t[n]) , sizeof(t[n][0]) , cmp );        n++;    }    for (int i = 0; i < n-1; i++) {//标记哪些是不符合条件的        for (int j = i+1; j < n; j++) {            if ( strcmp(t[i],t[j]) == 0 ) {                num[i]++;                num[j]++;            }        }    }    for (int i = 0; i < n; i++) {//存入另一个数组,以便输出        if ( num[i] == 0 ) {            strcpy ( ans[temp] , str[i] );            temp++;        }    }        qsort ( ans , temp , sizeof(ans[0]) , comp );    for (int i = 0; i < temp; i++)        cout << ans[i] << endl;    return 0;}


1 0
原创粉丝点击