1

假设我有一个字符串“text”,一个插入符号位置“caret”,然后想要找到当前单词(以空格分隔)。

我目前这样做的方式似乎效率低下,我想知道是否有人有一种有效的方式来做到这一点?

const char* text;
int caret;
int initpos;
int start;
int count = 0;
char word[256];

// text and caret values assigned here.

initpos = caret;
while(caret > 0 && text[caret] != ' ') // get start
{
    caret--;
    count++;
}
start = caret;
caret = initpos;

while(text[caret] && text[caret] != ' ') // get end
{
    caret++;
    count++;
}

word = strsub(text, start, count);
4

3 回答 3

5

“似乎效率低下”是指代码对您来说看起来效率低下,还是您已经测量并发现它对于您的目的来说太慢了?

您的方法需要 O( n ) 个步骤,其中n是输入中最长单词的长度。这非常快,除非你的话有 DNA 字符串的大小。

对于某些数据集,一种更快的方法是使用单词开始和结束位置的索引。存储间隔的二叉搜索树可以满足此要求,但代价是 O(lg N ) 检索时间,其中N是输入中的单词数。可能不值得。

于 2011-03-04T11:20:56.450 回答
1

我认为这是一种有效的方法。我只是建议检查字符是否是字母,而不是不是空格:

while(caret > 0 && ((text[caret]>='A' && text[caret]<='Z') || (text[caret]>='a' && text[caret]<='z')))

这将捕获其他情况,例如当单词以点、数字、括号等结尾时。

于 2011-03-04T12:11:19.980 回答
0
#include <ctype.h>

...
// Other definitions from above.
char *p = word;
char *q = text + caret;
while(q >= text && !isblank(*q)) {
   q--;
}
if (q < text) q++; // All non-blanks.
while (*q && !isblank(*q)) {
   *p++ = *q++;
}
*p = '\0';
// word now has nul terminated non-blank characters, p points to EOL or blanks.
于 2011-03-04T11:24:45.120 回答