Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16826 | Accepted: 6154 |
Description
Input
Output
Sample Input
i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Sample Output
me is correct aware: award m: i my me contest is correct hav: has have oo: too or: i is correct fi: i
题目大意:前面输入一系列字符串,以“#”结束,后面在输入一系列字符串,同样以“#”结束,问后面的字符串可以由前面哪些字符串通过添加,删除,替换一个字母得来,按照字典序输出,如果后面的和前面的相同,则直接输出xx is correct。
解题方法:先将前面的字符串保存到一颗字典树当中,以此来判断后面的字符串在前面是否存在,如果不存在再另作判断,看后面的字符串可以由前面哪些字符串通过添加,删除,替换一个字母得来。
#include <stdio.h> #include <iostream> #include <math.h> #include <string.h> using namespace std; typedef struct node { bool isword; node * next[26]; node() { isword = false; memset(next, 0, sizeof(next)); } }TreeNode; int cmp(char *str1, char *str2) { return strcmp(str1, str2); } void Insert(TreeNode *pRoot, char str[]) { int nLen = strlen(str); for (int i = 0; i < nLen; i++) { if (pRoot->next[str[i] - 'a'] == NULL) { pRoot->next[str[i] - 'a'] = new TreeNode; } pRoot = pRoot->next[str[i] - 'a']; } pRoot->isword = true; } //字典序判断后面的字符串是否在前面出现过 bool Find(TreeNode *pRoot, char str[]) { int nLen = strlen(str); for (int i = 0; i < nLen; i++) { if (pRoot->next[str[i] - 'a'] == NULL) { return false; } pRoot = pRoot->next[str[i] - 'a']; } if (pRoot->isword) { return true; } return false; } bool IsEqual(char str1[], char str2[]) { int nLen1 = strlen(str1); int nLen2 = strlen(str2); int nCount = 0; int i = 0, j = 0; if (nLen1 != nLen2)//如果两个字符串长度不相等 { while(i < nLen1 && j < nLen2) { if (str1[i] != str2[j])//碰到字符不相等时,长度大的字符串下边增加一 { nCount++;//遇到不相等的字符,统计数加一 if (nLen1 > nLen2) { i++; } else { j++; } } else//如果两个字符相等,则下标同时增加一 { i++; j++; } } if (nCount > 1)//不相等的字符数大于一,返回false { return false; } else { return true; } } else//当两个字符串相同时,直接判断相同位置不同字符串的数目是否大于一 { while(i < nLen1) { if (str1[i] != str2[i]) { nCount++;//不相同,计数加一 } i++; } if (nCount == 1)//计数等于一,返回true { return true; } else { return false; } } } int main() { int nCount1 = 0; char s1[10005][55], s2[55]; TreeNode *pRoot = new TreeNode; while(scanf("%s", s1[nCount1]) != EOF && s1[nCount1][0] != '#') { Insert(pRoot, s1[nCount1]); nCount1++; } while(scanf("%s", s2) != EOF && s2[0] != '#') { if (Find(pRoot, s2)) { printf("%s is correct\n", s2); } else { printf("%s:", s2); for (int i = 0; i < nCount1; i++) { int temp = strlen(s1[i]) - strlen(s2); if (temp <= 1 && temp >= -1) { if (IsEqual(s1[i], s2)) { printf(" %s", s1[i]); } } } printf("\n"); } } return 0; }