【发布时间】:2011-05-16 02:28:19
【问题描述】:
我正在尝试创建一个递归函数,该函数输出一个字符串向量,其中包含给定字符串的所有可能的单词组合(同时保留字母顺序)。基本上,这是一个自动更正打字程序的基础,它产生的效果类似于 iPhone。
vector<string> allPossibleWords(string str, vector<vector<char> > & adjacentKeys)
{
vector<string> words;
cout << str << endl;
if (str.length() == 0)
{
return words;
}
char firstLetter = str[0];
string restOf = str.substr(1, str.length() - 1);
int position = position_in_vector(firstLetter);
for (int i = 0; i < adjacentKeys[position].size(); i++)
{
string temp(1, adjacentKeys[position][i]);
words.push_back(temp);
}
//allPossibleWords(restOf, adjacentKeys);
}
int position_in_vector(char letter)
{
return (letter % 97);
}
例如,如果 str 是“yp”,则输出应该是一个包含值 {“yp”、“tp”、“gp”、“hp”、“up”、“yo”、“to”的向量,“去”,“ho”,“uo”,“yl”,“tl”,“gl”,“hl”,“ul”}。如果 str 为“y”,则输出应该是包含值 {“y”、“t”、“g”、“h”、“u”} 的向量。
存储在相邻键中的 26 个向量包含与存储在向量第一个位置的字母相邻的字母。
a qwsz
b vghjn
c xdfgv
d zserfcx
//and so on
我被这个函数卡住了,不知道如何递归地构建这个向量。
【问题讨论】:
-
我不明白这个问题。你能举出更多的例子吗?我不明白为什么“y”应该映射到{“y”、“t”、“g”、“h”、“u”}。编辑:我刚刚意识到“相邻”是指在 QWERTY 键盘上彼此相邻的字母?输出字符串的长度与输入字符串 (
str) 的长度相同,但是每个字母在键盘上被替换为附近的字母? -
正确 -- 每个字母都替换为键盘上它附近的字母,以及作为 (str) 一部分的原始字母。
-
快速观察:您是否考虑过返回的向量会很快变大。最坏的情况是 8^N 个条目,其中 N 是输入字符串中的字母数,每个字母的长度为 N 个字符;到 7 个字母时,您正在查看大约 14MB!
-
我已经想到了这一点,但这是一个非常初级的解决方案,将慢慢建立。这个递归函数只是一个基础。