2017-01-05 20 views
0

我想寫一個方法,它將字符串作爲輸入,並將輸出作爲有效數量的子字符串,可以從中產生,字符串將只有0和1的子字符串形成的只有一定的長度。驗證基於替代0和1的字符串

有效的子字符串情景:

子串僅具有連續0的有效和1

樣品輸入:

假設我們有一個字符串00110,子串我們從中得到的是00,01,11,10,0011,0110(只有偶數長度的奇數長度的子字符串不像001,011,110那樣有效),其中只有這些子字符串是有效的01,10,0011,它們具有連續的0和1

因此,在上述情況下,輸出爲3

條件: 輸入字符串的長度將是下5<n<10^5

我被困在驗證的子字符串,嘗試幾種不同的方法,但不成功,請讓我知道如果這個問題需要更多的澄清。

代碼:

public static int counting(string s) 
     { 
     //make into substrings function 
     var substrs = SubStrings(s); 

     foreach (var str in substrs.ToList()) 
     { 
      if (!IsValidStr(str)) 
       substrs.Remove(str); 
     } 
     var validstr=substrs.Distinct(); 

     return validstr.Count(); 
    } 

private static List<string> SubStrings(string s) 
    { 
     List<string> substrs = new List<string>(); 

     for (int i = 0; i < s.Length; i++) 
     { 
      for (int j = 2; j < s.Length; j += 2) 
      { 
       if ((s.Length - i >= j)) 
       { 
        substrs.Add(s.Substring(i, j)); 
       } 
      } 

     } 
     return substrs; 
    } 
+0

那麼,第一次測試會檢查他們是否長度....'substr.Length%2 == 0' – musefan

+0

你試過了什麼?現在,你只是想讓我們爲你寫一個遞歸方法 – Shoe

+0

「*連續的0和1的*」是什麼意思?爲什麼不是'0110'有效? –

回答

1

此功能將驗證你的子,我相信這是你所要求的與幫助。

我的理解是子字符串必須至少有一個1和一個0.而且它們必須連續分組。

這個概念基本上是循環的數字是檢查他們是否多次改變。最後我們檢查以確保一次是否改變。

bool IsValidSubstring(string s) 
{ 
    // Check for a valid length substring. 
    if(s.Length == 0 || s.Length % 2 != 0) 
     return false; 

    // Loop each character and make sure it doesn't change more than once. 
    char last = s[0]; 
    bool hasChanged = false; 
    for(var c in s) 
    { 
     // Check for a change in character. 
     if(c != last) 
     { 
      // If it has already changed once, then it's invalid. 
      if(hasChanged) 
       return false; 
      hasChanged = true; 
     } 
     last = c; 
    } 

    // If we get here, the only thing left to check is that it has changed at least once. 
    return hasChanged; 
} 

這個函數將返回真:對於01,10,0011 和假:00,11,0110 這是你問什麼。

+0

謝謝這個作品 – inan