取一个字符串中长度为N,且头尾字符不存于字符串strTrim中的所有子串,请帮看看代码是否可以进一步优化?

ynduanlian 2018-02-07 05:02:56
比如:
str="ABCDEFGHI"
strTrim="AC"
N=4
则AarryList中的结果为:
BCDE
DEFG
EFGH
FGHI


private ArrayList getSub1(string str,int n,string strTrim)
{
ArrayList arrRes = new ArrayList();
string strRes;
for (int i = 0; i <= str.Length - n; i++)
{//对字符串逐步扫描
StringBuilder sb = new StringBuilder();
for (int j = i; j < i + n ; j++)
{//输出扫描的起始点及以后的k个元素
sb.Append(str.Substring(j, 1));
}
strRes = sb.ToString();
if(!strRes.Equals(""))
{
if ((strTrim.IndexOf(strRes.Substring(0,1))<0) && (strTrim.IndexOf(strRes.Substring(strRes.Length-1,1))<0))
arrRes.Add(strRes);
}
}
return arrRes;
}
...全文
418 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynduanlian 2018-02-10
  • 打赏
  • 举报
回复
经过多次用大量数据实验得出: 1、xuzuning 的写法用SubString(i,n)减少了一层循环,效率有效大提高; 2、Contains比IndexOf 高效。 3、在本程序中,使用StringBuilder并没有任何效率上的改进,所以最后的代码不命用StringBuilder
  • 打赏
  • 举报
回复
引用 5 楼 From_TaiWan 的回复:
找到字符串后,放到list里面,还是用的Add方法,不知道用什么“原始”的方法替代之,这里好像费时,也不确定?
数量大的话建议StringBuilder先处理成逗号分隔的字符串,最后输出的时候再spilt成list。 原因是string的机制如果数量大内存申请还是会比较多,会增加耗时。
秋的红果实 2018-02-07
  • 打赏
  • 举报
回复
找到字符串后,放到list里面,还是用的Add方法,不知道用什么“原始”的方法替代之,这里好像费时,也不确定?
秋的红果实 2018-02-07
  • 打赏
  • 举报
回复
尽量用“原始”的方式,1000万次用时5秒多点

private const int N = 4;
private List<string> getSubString(string str,string strTrim)
{
    List<string> result = new List<string>();
    StringBuilder sb = new StringBuilder();
    char[] trim = strTrim.ToCharArray();

    for (int i = 0; i < str.Length - N + 1; i++)
    {
        if (str[i] == trim[0] || str[i] == trim[1] || str[i + N - 1] == trim[0] || str[i + N - 1] == trim[1]) continue;

        sb.Clear();
        for (int j = i; j < N + i; j++)
        {
            sb.Append(str[j]);
        }

        result.Add(sb.ToString());

    }

    return result;

}

private void Form5_Load(object sender, EventArgs e)
{
    List<string> result = new List<string>();
    string str = "ABCDEFGHI";
    string strTrim = "AC";

    System.Diagnostics.Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 10000000;i++ )
    {
        result = getSubString(str, strTrim);
    }
    sw.Stop();

    listBox1.Items.Clear();
    listBox1.Items.Add("Executed time is:" + sw.ElapsedMilliseconds.ToString() + "ms");
    foreach(string s in result)
    {
        listBox1.Items.Add(s);
    }
}

  • 打赏
  • 举报
回复
HashSet<char> hash = new HashSet<char>(strTrim);
判断用hash效率更高点
ynduanlian 2018-02-07
  • 打赏
  • 举报
回复
好的,等我试试运行10000000次看看效率上有多少差别
xuzuning 2018-02-07
  • 打赏
  • 举报
回复
            string str = "ABCDEFGHI";
string strTrim = "AC";
int N = 4;
ArrayList arrRes = new ArrayList();
for (int i = 0; i < str.Length - (N - 1); i++)
{
if (strTrim.Contains(str[i]) || strTrim.Contains(str[i + N - 1])) continue;
arrRes.Add(str.Substring(i, N));
}
foreach (var x in arrRes) Console.WriteLine(x);

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧