算法进修Day-3

算法进修Day-3

5.最长回文子串

难度:中等
题目要求:
给出一个字符串s,找到s中的最长回文子串
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串

示例1

输入:s = “babad”
输出:“bab”
解释:"aba"同样是符合题意的答案

示例2

输入:s = “cbbd”
输出:“bb”

题解

最开始的想法:滑动窗口法,遍历每一个字符,每次遍历用leftright来记录当前窗口然后向右滑动知道超出数组或者和下标数不相等就停止,最后向两边滑动窗口判断回文,直到不相等或超过边界。记录最长的子串

想法代码

public static string LongestPaildrome(string s)
    {
        int left = 0;
        int right = 0;
        int index = 0;
        int count = 0;
        int max = 0;
        int resultleft = 0;

        //遍历字符串中每一个字符
        while (index < s.Length)
        {
            right = left = index;
            //从左往右找相同的字符
            while (true)
            {
                right++;
                if (right >= s.Length || s[right] != s[left])
                {
                    right--;
                    break;
                }
            }
            //左右扩散来找回文字符串
            while (true)
            {
                right++;
                left--;
                if (left < 0 || right >= s.Length || s[left] != s[right])
                {
                    left++;
                    right--;
                    break;
                }
            }

            count = right - left + 1;
            if (max < count)
            {
                max = count;
                resultleft = left;
            }

            index++;
        }
        return s.Substring(resultleft, max);
    }

6. N字形变换

难度:中等
题目要求:
给定一个字符串s,根据给定的行数numRows,以从上往下,从左到右进行Z字形排列,之后输出需要从左往右依次读取,产生出一个新的字符串

示例1

输入:s = “PAYPALISHIRING”,numRows = 3
输出:“PAHNAPLSIIGYIR”

示例2

输入:s = “PAYPALISHIRING”,numRows = 4
输出:“PINALSIGYAHRPI”

示例3

输入:s = “A”, numRows = 1
输出:“A”

题解

最开始的方法:想找一个数学层面的通解,但是试了好几个表达式,都不怎么符合特定的例子,所以只能从新的地方入手
改进的方法:对每一个字符进行标记,将所得的字符所对应的行数记录到一个数组中,创建一个字典,对每一行存储的字符串进行拼接,之后输出

修改后的代码

public static string Convert(string s, int numRows)
    {
        int len = s.Length;
        int[] row = new int[len];
        //k:行数,cnt:字符下标
        int k = 1, f = 1, cnt = 0;
        //根据下方循环中的式子来确定每一个字符所在的行数
        while (cnt < len)
        {
            row[cnt++] = k;
            k += f;
            if (k == 1 || k == numRows) f *= -1;
        }
        Dictionary map = new Dictionary();
        for (int i = 0; i < len; i++)
        {
            if (!map.ContainsKey(row[i]))
            {
                map.Add(row[i], new StringBuilder(""));
            }
            map[row[i]].Append(s[i]);
        }
        StringBuilder ans = new StringBuilder("");
        foreach (var i in map)
        {
            ans.Append(i.Value);
        }
        return ans.ToString();
    }

你可能感兴趣的:(算法进修,算法,c#,leetcode)