【发布时间】:2012-09-27 07:57:26
【问题描述】:
我有两个字符串,例如“hello”和“eo”,我希望在两个字符串之间找到重复的字符,即:在本例中为“e”和“o”。
我的算法会这样
void find_duplicate(char* str_1, char* str_2, int len1, int len2)
{
char c ;
if(len1 < len2)
{
int* idx_1 = new int[len1]; // record elements in little string
// that are matched in big string
for(int k = 0 ; k < len1 ; k++)
idx_1[k] = 0;
int* idx_2 = new int[len2]; // record if element in str_2 has been
// matched already or not
for(int k = 0 ; k < len2 ; k++)
idx_2[k] = 0;
for(int i = 0 ; i < len2 ; i++)
{
c = str_1[i];
for(int j = 0 ; j < len1 ; j++)
{
if(str_2[j] == c)
{
if(idx_2[j] == 0) // this element in str_2 has not been matched yet
{
idx_1[i] = j + 1; // mark ith element in idx as matched in string 2 at pos j
idx_2[j] = 1;
}
}
}
}
// now idx_1 and idx_2 contain matches info, let's remove matches.
char* str_1_new = new char[len1];
char* str_2_new = new char[len2];
int kn = 0;
for(int k = 0 ; k < len1 ; k++)
{
if(idx_1[k] > 0)
{
str_1_new[kn] = str_1[k];
kn++;
}
}
kn = 0;
for(int k = 0 ; k < len2 ; k++)
{
if(idx_2[k] > 0)
{
str_2_new[kn] = str_2[k];
kn++;
}
}
}
else
{
// same here, switching roles (do it yourself)
}
}
我觉得我的解决方案很尴尬: - 在第一个 if/else 和代码重复中两种情况的对称性 - 时间复杂度:2*len1*len2 操作用于查找重复项,然后 len1 + len2 操作用于删除 - 空间复杂度:两个 len1 和两个 len2 char*。
如果没有给出len1 和len2 怎么办(使用和不使用STL 向量)?
你能提供这个算法的实现吗?
谢谢
【问题讨论】:
-
我会对字符串中的字符进行排序并一次性比较它们。
标签: c++ string algorithm substring string-matching