Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编写一个函数,比较两个字符串并返回第三个字符串,其中仅包含两个字符串中出现的字母_C#_.net_Algorithm_Data Structures - Fatal编程技术网

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']