LeetCode 6 Z字形变换(字符串)
2018-11-07 16:26
393 查看
题目要求:
将字符串
"PAYPALISHIRING"以Z字形排列成给定的行数:
[code]P A H N A P L S I I G Y I R
之后从左往右,逐行读取字符:
"PAHNAPLSIIGYIR"
实现一个将字符串进行指定行数变换的函数:
[code]string convert(string s, int numRows);
示例 1:
[code]输入: s = "PAYPALISHIRING", numRows = 3 输出: "PAHNAPLSIIGYIR"
示例 2:
[code]输入: s = "PAYPALISHIRING", numRows = 4 输出: "PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
C++代码:
[code]class Solution { public: string convert(string s, int numRows) { if (numRows <= 1) return s; const int len = (int)s.length(); string *str = new string[numRows]; int row = 0, step = 1; for (int i = 0; i < len; ++i) { str[row].push_back(s[i]); if (row == 0) step = 1; else if (row == numRows - 1) step = -1; row += step; } s.clear(); for (int j = 0; j < numRows; ++j) { s.append(str[j]); } delete[] str; return s; } };
结果:
解析:
代码读起来也是比较清晰的。
首先如果numRows≤1的话,就直接返回原来的字符串s
如果大于1,我们重新定义一个str字符串,用来装重新排好序的字符。
这个str一共有numRows行,我们通过一个for循环来对原字符串s中的每个元素逐一遍历操作,因此时间复杂度是O(n)级别的。
row也就是numRows行,假设一共需要分4行,那么row=0、1、2、3;
一开始往下填充字符时,step=1,也就是正向(我们把向下当正向,向上的时候当反向)
所以row从0->3时,step=1,然后就从原字符串s中依次取出当前的字符,放入str中,
当row遍历到3(numRows-1)时,这时候改step=-1,因为已经到最底了,我们要逐一从下往上遍历,具体操作跟之前一样;
然后row从3->0时,step=-1;
当row又重新回到0(row == 0)时,step又变回1,因为已经到最顶了,接下来又要重复之前的步骤,从上到下遍历,存当前元素进str。
当对字符串s中的所有字符逐一遍历完成后,就会按照从上到下的顺序排序好,这时候只需要按顺序,从str里按行读取每一行的所有字符,就可以得到最终排序的结果。
阅读更多相关文章推荐
- [LeetCode] Edit Distance 字符串变换为另一字符串动态规划
- LeetCode 6. ZigZag Conversion--字符串按之字形放置,然后横向顺序输出
- LeetCode | 6. ZigZag Conversion(之字形变换)
- 【LeetCode】之字形变换
- Z字形变换 - LeetCode
- [LeetCode-6]ZigZag字符串的变换输出
- leetcode【第七周】Z字形排序字符串
- [LeetCode] Valid Anagram - 字符串排序比较系列
- LeetCode字符串(二)
- 每天一道LeetCode-----寻找给定字符串中重复出现的子串
- 【LeetCode】005 Longest Palindromic Substring 最长的回文子字符串
- LeetCode -- 求字符串数组中的最长公共前缀
- [LeetCode] Add Bold Tag in String 字符串中增添加粗标签
- [LeetCode] Reverse Words in a String 翻转字符串中的单词
- LeetCode 找到一个字符串数组的最长公共前缀
- leetcode---multiply-strings---字符串
- LeetCode 8 字符串转数字
- 【LeetCode-面试算法经典-Java实现】【151-Reverse Words in a String(反转字符串中的单词)】
- [leetcode] 【字符串】 65. Valid Number
- LeetCode242_Valid Anagram(判断两个字符串是不是由完全一样字符组成) Java题解