试图从C#中的字符串创建子串

时间:2018-04-10 11:28:18

标签: c#

我有一个字符串aaaaabbbbbccccc我有一个具有某些规则的字典

Dictionary<string, string> rules = new Dictionary<string, string>();
rules.Add("abc", "aab");
rules.Add("ac", "ba");
rules.Add("cb", "cc");

这意味着如果字符串有abc,它将被替换为aab,但字符串不具有匹配的任何规则。所以,我正在根据这些规则从旧字符串中创建一个新字符串。例如,如果我将旧字符串重新排列为abcabcabcabcabc,则可以应用规则。但我被困在重新排列。我尝试使用IndexOfRemove函数,但我没有得到正输出。这是我的代码

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.

任何人都可以帮助我做错了或有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您的解释与您的代码不符。

在您的解释中,您说aaaaabbbbbccccc与任何规则都不匹配(例如“abc”规则)。但是,在您的代码中,您不会检查它是否包含“abc”,而是包含“a”,“b”和“c”,而不一定是单个块:

if (s.Contains("a") && s.Contains("b") && s.Contains("c"))

这是一个重要的区别:

  • aaaaabbbbbccccc 包含abc(规则不适用)
  • aaaaabbbbbccccc 确实包含abc(规则适用)

你自相矛盾。这里哪个是正确的,代码或你的解释?规则是否检查确切的字符串,还是单独检查所有字符?

尴尬的字符串操作。

根据您的代码;我推断你没有经历过一些非常常见的字符串操作(没有违法行为)。除非你反驳我,否则我会假设你的解释是正确的,你的代码不是。

检查字符串是否包含子字符串:

正如我之前解释的那样,检查字符串是否包含子字符串之间存在重要区别:

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(如果没有,则不会被替换)
  •   

记下第二个和第三个要点。

    如果子字符串多次出现,
  1. String.Replace()将替换所有次出现。根据你的解释,我认为这就是你想要的(如果一个子串可能不止一次出现,那么就开始)。
  2. 如果找不到子字符串,String.Replace()将为您提供与其输入相同的输出。什么都不会改变。这意味着您可以在字符串上执行规则,而无需检查子字符串是否存在:
    • 如果确实存在,那么您的价值将被替换;就像你希望它发生一样。
    • 如果它不存在,那么什么都不会发生;这也是你想要发生的事情。
  3. 您可以大大简化代码!

    创建字典;

    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();
}