0x01.问题
给你一个字符串
s
。请你按照单词在s
中的出现顺序将它们全部竖直返回。单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
每个单词只能放在一列上,每一列中也只能有一个单词。
输入示例:s = “CONTEST IS COMING”
输出示例:[“CIC”,“OSO”,“N M”,“T I”,“E N”,“S G”,“T”]
提示:1 <= s.length <= 200
题目数据保证两个单词之间只有一个空格
0x02.暴力模拟
首先看到题目,应该先注意一下数据大小,一看,200,说明,这个题目肯定不限制复杂度,所以,先不考虑时间和空间的维度,先想尽办法把这个题目模拟出来。
模拟的思路:(题目怎么做,代码怎么写)
- 把所有单词单独拿出来放一个字符串数组。
- 遍历得到原字符串的单词最大长度,因为这就是结果数组的长度。
- 按照竖直的方法,依次从单词数组里拿出值往结果数组里放。
- 如果单词的长度小于最长单词的长度,就用空格补,这也是题目中补的体现。
- 最后,如果结果数组中有字符串末尾有空格,删除空格,这也是题目中末尾不能有空格的体现。
0x03.暴力模拟代码
class Solution {
public:
vector<string> printVertically(string s) {
vector<string> table;
int i,j=0,maxj=0,k;
for(i=0;i<s.size();i++){
string a="";
if(i==s.size()-1||s[i+1]==' '){
for(k=i-j;k<=i;k++){
a+=s[k];
}
table.push_back(a);
maxj=max(j+1,maxj);
j=0;
continue;
}
if(s[i]!=' ') j++;
}
vector<string> result(maxj,"");
for(i=0;i<result.size();i++){
for(k=0;k<table.size();k++){
if(table[k].size()<=i) result[i]+=" ";
else result[i]+=table[k][i];
}
while(result[i].back()==' ') result[i].pop_back();
}
return result;
}
};
具体的细节久看基本功了。
然后事实是这样的:
说明,只要题目数据量不是很大,放心的去模拟吧!!!
ATFWUS --Writing By 2020–03–19