C# 编写一个函数,比较两个字符串并返回第三个字符串,其中仅包含两个字符串中出现的字母
我有这个作业。并用下面的方法解决了这个问题。我需要你们的意见,无论这是一个好方法,还是我需要使用任何其他数据结构以更好的方式解决它C# 编写一个函数,比较两个字符串并返回第三个字符串,其中仅包含两个字符串中出现的字母,c#,.net,algorithm,data-structures,C#,.net,Algorithm,Data Structures,我有这个作业。并用下面的方法解决了这个问题。我需要你们的意见,无论这是一个好方法,还是我需要使用任何其他数据结构以更好的方式解决它 public string ReturnCommon(string firstString, string scndString) { StringBuilder newStb = new StringBuilder(); if (firstString != null && scndString !=
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();
}
在我看来没问题,但看在上帝的份上,伙计-使用一些描述性变量名 对于第一种方法来说,这很好,但是您可以做一些改进,并且有一个小错误
- 如果
包含b
中已经在a
中的字符,您将重复该字符c
<> LI>为了避免重复,您可以考虑使用<代码> SET>代码>来存储字符,因为<代码> SET>代码>不会重复。
- 用
串联组合字符串通常效率低下;考虑使用<代码> StringBuilder < />代码或类似的字符串程序集类。+=
- 你的变量名不是很有描述性
- 如果
或a
为空,您根本不需要做任何工作!只需返回一个空字符串b
你也可以考虑一些更复杂的改进,想象一下如果你开始使用巨大的字符串,你的算法是如何伸缩的。例如,一种方法可能是,如果一个字符串比另一个长得多,则可以对较长的字符串进行排序并删除重复项。然后,您可以非常快速地对较短字符串的字符进行二进制搜索。看起来不错。根据您使用的语言,您可以进行两项优化:
- 您可以将b的字母收集到某种有序结构中(以加快搜索速度),如果不重复。。。更好(一套)
- 您可以使用某种StringBuilder(如果是Java或.Net)来避免在循环中每次串联时重新创建字符串
不管怎么说,这都是适合大字符串的优化。。。因此,我不知道它们是否适合您使用,或者是否适合预期的家庭作业。取决于输入字符串的长度,字母是什么,以及输出的外观是什么(重复)还有一些其他方法 例如: 如果字母只有[A-Z]个字符,并且每个字母在输出字符串中只出现一次,则可以构建单独的字符串(或字符表)“ABC…XZ”(我们称之为
字母)并对每个
运行,循环检查字母
,并根据字母
中的每个字母检查两个输入字符串
这个为每个输入字符串提供了26次循环迭代和不再,然后对Contains()
方法的52次调用,无论输入字符串有多长。对于另一种解决方案,您可以将字符串视为可枚举项,并像这样使用Intersect()
:
public static string Common(string first, string second)
{
return new string((first.Intersect(second)).ToArray());
}
为了改进John Feminella的最后一个建议,比二进制搜索(对于任何足够长的字符串)更快的是在哈希集中进行查找;或者,如果布尔值是ASCII或UTF8字符而不是UTF16字符,则在256个元素的布尔值数组中进行查找
- 实例化一个空哈希集或布尔值的空数组;将此变量命名为找到的
- 对于第一个字符串中的每个字符,要么将该字符添加到hashset(但要注意第一个字符串中的重复字符),
或者将
found
数组中的对应元素设置为true;
这将需要线性O(n)时间
- 对于第二个字符串中的每个字符,测试哈希集中是否存在该字符
或者“found”数组中的对应元素是否为true:
如果找到,则将该字符添加到返回字符串中,并删除该字符
从hashset或清除数组中的布尔元素,这样就不会再次找到它(注意第二个字符串中的重复字符);这将需要线性O(n)时间
使用LINQ:
a.ToCharArray().Intersect<char>(b.ToCharArray())
a.ToCharArray().Intersect(b.ToCharArray())
但是这是区分大小写的。仅供参考:以下是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
*/
/*Q:编写一个函数f(a,b),它接受两个字符串参数
并返回一个字符串,该字符串仅包含在这两者中找到的字符
按a顺序排列的字符串*/
#包括
#包括
#包括
#包括
使用名称空间std;
/*A:不清楚:字符串A中重复字符*/
字符串CommonChars(常量字符*a,常量字符*b)
{
字符串结果(“”);
如果(!a | | |!b | |!*a | |!*b)
返回结果;
映射散列;
int len1=strlen(a),len2=strlen(b);
对于(int i=0;isecond)
{
结果+=a[i];
hash[a[i]]=false;//或:hash.erase(它);
}
}
返回结果;
}
int main()
{
cout这里是我的python解决方案。如果我没有错的话,它应该需要线性O(n)时间
结果如下所示:
['a', 't', 'm']
并在结果中检查重复,这样您就可以检查是否(!c.Contains(d)&&b.Contains(d)
…+1用于作为家庭作业问题的一部分提供您自己的答案。+1用于更改解决方案,但您肯定不能将变量命名为char并将数据类型也命名为char?不要使用缩写。secondString而不是SCNDSTRNGC是否有人可以使用LINQ给出一个示例?问题不适定。假设两个输入字符串是“happing”y'和'Ypres'。是否输出'py'或'ppy'?更新的变量名…LINQ中的示例可能也很有趣!嗨,为了提高性能,您甚至可以通过其字符检查最小的字符串和循环。这样可以节省循环的数量。要缩放大字符串,使用hashset或数组查找更好。hashset,未设置-不要在我们身上使用Java:我猜任务是
['a', 't', 'm']