public class Solution {
    public string CountAndSay(int n) {
        if (n == 1)
            return "1";
 
        return RLE(CountAndSay(n - 1));
    }
 
    public string CountAndSayIterative(int n) {
        string result = "1";
 
        for (int i = 2; i <= n; i++) {
            result = RLE(result);
        }
 
        return result;
    }
 
    public string RLE(string s) {
        int count = 1;
 
		//not needed as last flush handles this
        //if (s.Length == 1) return count.ToString() + s;
 
        var sb = new StringBuilder();
        for (int i = 0; i < s.Length - 1; i++) {
            if(s[i] != s[i + 1]){
                sb.Append(count); sb.Append(s[i]);
                count = 1;
            }
            else {
                count++;
            }
        }
 
        // flush the last run
        sb.Append(count);
        sb.Append(s[s.Length - 1]);
 
        return sb.ToString();
    }
}