public string ReturnCommon(string firstString, string scndString)
{
StringBuilder newStb = new StringBuilder();
if (firstString != null && scndString != null)
{
foreach (char ichar in firstString)
{
if (!newStb.ToString().Contains(ichar) && scndString.Contains(ichar))
newStb.Append(ichar);
}
}
return newStb.ToString();
}
答案 0 :(得分:19)
对于替代解决方案,您可以将字符串视为枚举,并使用Intersect()
,如下所示:
public static string Common(string first, string second)
{
return new string((first.Intersect(second)).ToArray());
}
答案 1 :(得分:8)
对于第一种方法来说这很好,但是你可以做一些改进,并且有一个小错误。
b
包含a
中已存在于c
中的字符,则会重复该字符。Set
来存储字符,因为Set
不会重复。+=
连接组装字符串通常效率低下;考虑使用StringBuilder
或类似的字符串汇编类。a
或b
为空,则您根本不需要做任何工作!只需返回一个空字符串。通过想象如果开始使用大字符串,算法如何缩放,您也可以考虑一些更复杂的改进。例如,一种方法可能是如果一个字符串比另一个字符串长得多,您可以对较长的字符串进行排序并删除重复字符串。然后你可以很快地对较短字符串的字符进行二进制搜索。
答案 2 :(得分:3)
为了改进John Feminella的最后一个建议,比二分搜索(对于任何足够长的字符串)更快的是在hashset中查找;或者在256元素的布尔数组中查找,如果它们是ASCII或UTF8字符而不是UTF16字符。
found
。found
数组中的相应元素设置为true;
这将花费线性O(n)时间。答案 3 :(得分:2)
似乎很好。您可以根据所使用的语言进行一对优化:
无论如何,这是对大型,大型字符串有用的优化......所以,我不知道它们是否适合您的使用,或者是否适用于预期的家庭作业。
答案 4 :(得分:2)
取决于输入字符串的多长时间,字母是什么以及输出应该如何(重复)还有一些其他字符串方法
例如:
如果字母 只有[AZ]字符且每个字母在输出字符串中只显示 可以构建单独的字符串(或字符表)'ABC ... XZ'(让我们称之为letters
)并运行for each
循环letters
并检查两个来自letters
的每个字母的输入字符串。
这个为每个输入字符串提供26次循环迭代和不再然后 52次调用 Contains()
方法 - 无论是什么输入字符串的长度。
答案 5 :(得分:1)
使用LINQ:
a.ToCharArray().Intersect<char>(b.ToCharArray())
然而,这是区分大小写的。
答案 6 :(得分:0)
仅供参考:这是C / C ++代码:
/* Q: Write a function f(a, b) which takes two character string arguments
and returns a string containing only the characters found in both
strings in the order of a. */
#include <iostream>
#include <string>
#include <cstring>
#include <map>
using namespace std;
/* A: Unclear: repeated chars in string a? */
string CommonChars(const char* a, const char* b)
{
string result("");
if (!a || !b || !*a || !*b)
return result;
map<char, bool> hash;
int len1 = strlen(a), len2 = strlen(b);
for (int i = 0; i < len2; ++i)
hash[b[i]] = true;
for (int i = 0; i < len1; ++i)
{
map<char, bool>::iterator it = hash.find(a[i]);
if (it != hash.end() && it->second)
{
result += a[i];
hash[a[i]] = false; // OR: hash.erase(it);
}
}
return result;
}
int main()
{
cout << CommonChars("abcdefgbx", "gcfcba") << endl;
return 0;
}
/* Output:
abcfg
*/
答案 7 :(得分:0)
这是我在python中的解决方案。如果我没有错,它应该采用线性O(n)时间。
# Write a function f(a, b) which takes two character string arguments
# and returns a string containing only the characters found in both
# strings in the order of a.
first_string = "attempt"
second_string="tmay" #second string
result = []
#it's O(n) operation
for char in first_string:
if char in second_string:
if char not in result:
result.append(char)
print result
结果如下:
['a', 't', 'm']
答案 8 :(得分:-1)
对我来说看起来不错,但对于上帝的人来说 - 使用一些描述性的变量名称!!