我有一个字符串aaaaabbbbbccccc
我有一个具有某些规则的字典
Dictionary<string, string> rules = new Dictionary<string, string>();
rules.Add("abc", "aab");
rules.Add("ac", "ba");
rules.Add("cb", "cc");
这意味着如果字符串有abc
,它将被替换为aab
,但字符串不具有匹配的任何规则。所以,我正在根据这些规则从旧字符串中创建一个新字符串。例如,如果我将旧字符串重新排列为abcabcabcabcabc
,则可以应用规则。但我被困在重新排列。我尝试使用IndexOf
和Remove
函数,但我没有得到正输出。这是我的代码
string s;
s = "aaaaabbbbbccccc";
string newString = "";
int ia, ib, ic;
//Formulating rule 1
if (s.Contains("a") && s.Contains("b") && s.Contains("c"))
{
ia = s.IndexOf("a");
ib = s.IndexOf("b");
ic = s.IndexOf("c");
if (ia < ib && ib < ic)
{
newString += "abc";
s.Remove(ia, 1);
s.Remove(ib, 1);
s.Remove(ic, 1);
}
}
Console.WriteLine("New String " + newString);
Console.WriteLine("Old String " + s);
我正在
New String abc
Old String aaaaabbbbbccccc //Which is wrong.
任何人都可以帮助我做错了或有更好的方法吗?
答案 0 :(得分:0)
在您的解释中,您说aaaaabbbbbccccc
与任何规则都不匹配(例如“abc”规则)。但是,在您的代码中,您不会检查它是否包含“abc”,而是包含“a”,“b”和“c”,而不一定是单个块:
if (s.Contains("a") && s.Contains("b") && s.Contains("c"))
这是一个重要的区别:
aaaaabbbbbccccc
不包含abc
(规则不适用)aaaaabbbbbccccc
确实包含a
,b
和c
(规则适用)你自相矛盾。这里哪个是正确的,代码或你的解释?规则是否检查确切的字符串,还是单独检查所有字符?
根据您的代码;我推断你没有经历过一些非常常见的字符串操作(没有违法行为)。除非你反驳我,否则我会假设你的解释是正确的,你的代码不是。
检查字符串是否包含子字符串:
正如我之前解释的那样,检查字符串是否包含子字符串之间存在重要区别:
s.Contains("abc") //1
并检查字符串是否包含子字符串的每个字符:
s.Contains("a") && s.Contains("b") && s.Contains("c") //2
作为一个更实际的例子;我的用户名(Flater)是否包含子字符串“Fertla”?
//1
中的逻辑,则答案为否。//2
中的逻辑,答案是是。根据您的解释,您应该使用//1
更换字符串:
这意味着如果字符串包含
abc
,则会将其替换为aab
有一种非常简单的方法:
s.Replace("abc", "aab");
一些例子:
abcdef
变为aabdef
abcabcabc
变为aabaabaab
(它取代所有出现次数)uvwxyz
变为uvwxyz
(如果没有,则不会被替换)
记下第二个和第三个要点。
String.Replace()
将替换所有次出现。根据你的解释,我认为这就是你想要的(如果一个子串可能不止一次出现,那么就开始)。String.Replace()
将为您提供与其输入相同的输出。什么都不会改变。这意味着您可以在字符串上执行规则,而无需检查子字符串是否存在:
创建字典;
Dictionary<string, string> rules = new Dictionary<string, string>();
rules.Add("abc", "aab");
rules.Add("ac", "ba");
rules.Add("cb", "cc");
定义你的字符串:
string s = "aaaaaaabbbbbbccccccc";
其余的很容易:
foreach(var rule in rules)
{
s = s.Replace(rule.Key, rule.Value);
}
这将尝试为您定义的每个规则执行替换。如果找到适用的规则;然后它将取代值。
注意强>
此代码假定您的替换值不会发生冲突。如果您确实想要避免冲突,则必须检查所有已定义规则的子字符串是否存在(Contains()
)之后实际替换值。
答案 1 :(得分:0)
我很难理解你的需求,但这里有一个解决方案,你可以告诉我这是否与你想要的一样接近吗?
private static string WeirdArrangement (string input)
{
//string input = "aabbcc[aczç_eyvur]";
string validChars = "abc";
string pattern = "abc"; // Must be a composition of all valid char
var invalidChars = input.Where(c => !validChars.Contains(c));
var validOccurences = input.Where(c => validChars.Contains(c))
.GroupBy(c => c)
.Select(c => new { Char = c.Key, Count = c.Count() });
var minPattern = validOccurences.Min(o => o.Count);
// Build time
StringBuilder builder = new StringBuilder();
//new StringBuilder(pattern.Length * minPattern + invalidChars.Count() + leftoverCount);
// X time partern
for (int i = 0; i < minPattern; i++) builder.Append(pattern);
//Rest of the validOccurences
foreach (var charOccurency in validOccurences)
{
for (int i = minPattern; i < charOccurency.Count; i++) builder.Append(charOccurency.Char);
}
//Invalid char
foreach (var invalidChar in invalidChars)
{
builder.Append(invalidChar);
};
return builder.ToString();
}