Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16826 | Accepted: 6154 |
Descriptionnode
Inputios
Outputapp
Sample Inputthis
i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Sample Outputspa
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; }