C# 在我的算法中,查找包含精确字符集的最小子字符串的大小的缺陷在哪里?
设置是我有一个像C# 在我的算法中,查找包含精确字符集的最小子字符串的大小的缺陷在哪里?,c#,string,algorithm,time-complexity,C#,String,Algorithm,Time Complexity,设置是我有一个像 s = "GAAATAAA" 还有一本像这样的字典 surpdic = { 'A' -> 4 } 字典的意思是s有4多余的A字符 我的算法想要找到的是s中包含4As的最小子串的大小。我不明白为什么它不能运行所有的测试用例 它应该像这样工作 GAAATAAA ||| ||| i|| j|| j - i = 4, mindiff = 4 || || i| j| j - i = 4, mindiff = 4 | | i j j
s = "GAAATAAA"
还有一本像这样的字典
surpdic = { 'A' -> 4 }
字典的意思是s
有4
多余的A
字符
我的算法想要找到的是s
中包含4
A
s的最小子串的大小。我不明白为什么它不能运行所有的测试用例
它应该像这样工作
GAAATAAA
||| |||
i|| j|| j - i = 4, mindiff = 4
|| ||
i| j| j - i = 4, mindiff = 4
| |
i j j - i = 4, mindiff = 4
关于我提供的例子。换句话说,从字符串的左到右,找到包含所有字符的第一个跨距,然后有效地取出左指针并将其移动到下一个可能跨距的开头;始终跟踪最小跨度
int mindiff = Int32.MaxValue;
int left = 0;
while(!surpdic.ContainsKey(s[left++]));
for(int right = left; right < s.Length; ++right)
{
if(surpdic.ContainsKey(s[right]))
surpdic[s[right]] -= 1;
if(surpdic.Values.All(count => count == 0))
{
int diff = right - left;
if(diff < mindiff)
mindiff = diff;
surpdic[s[left]] += 1;
while(!surpdic.ContainsKey(s[left++]));
}
}
int mindiff=Int32.MaxValue;
int左=0;
而(!surpdic.ContainsKey(s[left++]);
用于(int right=左;rightcount==0))
{
int diff=右-左;
if(diff
编辑:下面是一个给我带来运行时错误的案例
using System.IO;
using System.Linq;
using System.Text;
using System;
using System.Collections.Generic;
public class Solution
{
static int SmallestSubstringContainingChars(string source, Dictionary<char,int> surpdic)
{
int mindiff = Int32.MaxValue;
int left = 0;
while(!surpdic.ContainsKey(source[left++]));
for(int right = left; right < source.Length; ++right)
{
if(surpdic.ContainsKey(source[right]))
surpdic[source[right]] -= 1;
if(surpdic.Values.All(count => count == 0))
{
int diff = right - left;
if(diff < mindiff)
mindiff = diff;
surpdic[source[left]] += 1;
while(!surpdic.ContainsKey(source[left++]));
}
}
return mindiff + 1;
}
public void Main(string[] args)
{
string s = "ACTGATTT";
Dictionary<char,int> d = new Dictionary<char,int>() { { 'A' , 1 }, { 'T' , 3 } };
Console.WriteLine( SmallestSubstringContainingChars(s,d));
}
}
使用System.IO;
使用System.Linq;
使用系统文本;
使用制度;
使用System.Collections.Generic;
公共类解决方案
{
静态int SmallestSubstringContainingChars(字符串源,字典)
{
int mindiff=Int32.MaxValue;
int左=0;
而(!surpdic.ContainsKey(source[left++]);
for(int right=left;rightcount==0))
{
int diff=右-左;
if(diff
我发现您的代码中有很多问题
首先是你向左递增的方式
此外,您正在修改字典,因此下一次执行将从错误的字典开始,这就是我创建副本的原因
如果字典条目的值已经为0,则不要将其递减,否则您的All
代码将无法工作
检查下面的代码,如果您不理解任何内容,请在下面进行评论。如果未找到所需图案,则返回-1:
static int SmallestSubstringContainingChars(string source, Dictionary<char, int> surpdic)
{
int mindiff = -2;
int left = 0;
while (left<source.Length)
{
if (surpdic.ContainsKey(source[left]))
{
Dictionary<char, int> md = new Dictionary<char, int>(surpdic);
md[source[left]] -= 1;
for (int right = left; right < source.Length; ++right)
{
if (md.ContainsKey(source[right]) && md[source[right]]>0)
md[source[right]] -= 1;
if (md.Values.All(count => count == 0))
{
int diff = right - left;
if (mindiff==-2 || diff < mindiff)
mindiff = diff;
}
}
}
left++;
}
return mindiff + 1;
}
static int SmallestSubstringContainingChars(字符串源,字典)
{
int mindiff=-2;
int左=0;
while(left0)
md[来源[右]]-=1;
if(md.Values.All(count=>count==0))
{
int diff=右-左;
if(mindiff==-2 | | diff
我发现您的代码中有很多问题
首先是你向左递增的方式
此外,您正在修改字典,因此下一次执行将从错误的字典开始,这就是我创建副本的原因
如果字典条目的值已经为0,则不要将其递减,否则您的All
代码将无法工作
检查下面的代码,如果您不理解任何内容,请在下面进行评论。如果未找到所需图案,则返回-1:
static int SmallestSubstringContainingChars(string source, Dictionary<char, int> surpdic)
{
int mindiff = -2;
int left = 0;
while (left<source.Length)
{
if (surpdic.ContainsKey(source[left]))
{
Dictionary<char, int> md = new Dictionary<char, int>(surpdic);
md[source[left]] -= 1;
for (int right = left; right < source.Length; ++right)
{
if (md.ContainsKey(source[right]) && md[source[right]]>0)
md[source[right]] -= 1;
if (md.Values.All(count => count == 0))
{
int diff = right - left;
if (mindiff==-2 || diff < mindiff)
mindiff = diff;
}
}
}
left++;
}
return mindiff + 1;
}
static int SmallestSubstringContainingChars(字符串源,字典)
{
int mindiff=-2;
int左=0;
while(left0)
md[来源[右]]-=1;
if(md.Values.All(count=>count==0))
{
int diff=右-左;
if(mindiff==-2 | | diff
good fit for codereview.stackExtange它可能有助于向我们展示测试用例,包括那些有效和失败的测试用例。@EhsanSajjad非常确定CR的员工只接受已经有效的代码。老实说,我不知道你想在这里做什么。运行时错误是因为你向左递增的方式。当您在字典中找到一个字母时,您会增加索引,因此您会尝试访问字典中的“C”字符(不在dic中)。尝试将while更改为while(!suprdic.ContainsKey(source[left]){if(left==(source.Length-1))break;left++;}非常适合codereview.StackExtange它可能有助于向我们展示测试用例,包括那些有效的和失败的。@EhsanSajjad非常确定CR的人员只接受已经有效的代码。老实说,我不知道你想在这里做什么。运行时错误是因为你向左递增的方式。当您在字典中找到一个字母时,您会增加索引,因此您会尝试访问字典中的“C”字符(不在dic中)。尝试将while更改为while(!suprdic.ContainsKey(source[left]){if(left==(source.Length-1))break;left++;}