leetcode 第1324题
给你一个字符串 s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。
单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
每个单词只能放在一列上,每一列中也只能有一个单词。
示例 1:
输入:s = “HOW ARE YOU”
输出:[“HAY”,“ORO”,“WEU”]
解释:每个单词都应该竖直打印。
“HAY”
“ORO”
“WEU”
示例 2:
输入:s = “TO BE OR NOT TO BE”
输出:[“TBONTB”,“OEROOE”," T"]
解释:题目允许使用空格补位,但不允许输出末尾出现空格。
“TBONTB”
“OEROOE”
" T"
示例 3:
输入:s = “CONTEST IS COMING”
输出:[“CIC”,“OSO”,“N M”,“T I”,“E N”,“S G”,“T”]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-words-vertically
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看到这个问题我第一反应是一位数组和二维数组的转换,因为数组在一维的时候以空格分开不一样长,比如 :I AM TEACHER这个字符串分割就会是字符串 : I 字符串: AM 字符串: TEACHER
所以无法找出规律。我选择的处理方式是将这个字符串按照规定放入到一个vector<string>
当中,将这个变成二维的数组,这样我只需要按照行遍历就行。但是还有一个问题: 每一行字符串不一样长,所以我们如果写循环会造成数组越界,但是不写循环又无法遍历这个数组,我们需要在循环内部加上判断条件,判断数组是否越界,如果越界就填充空格。
for(size_t i = 0;i < max_size;++i)
{
string contemp;
for(size_t j = 0; j < vec.size();++j)
{
if(j < vec.size() && i < vec[j].size())
contemp.push_back(vec[j][i]);
else
contemp.push_back(' ');
}
res.push_back(contemp);
}
这时候题目还要求说每一行string的末尾不能是空格,这时候我们需要再遍历一遍这个vector<string>
将末尾的空格去除,最后得到想要的结果。
下面是完整的代码
class Solution {
public:
vector<string> printVertically(string s) {
vector<string> vec;
vector<string> res;
int begin = 0;
int end = s.size() - 1;
size_t max_size = 0;
for(size_t i = 0;i < s.size();++i)
{
if(s[i] == ' ')
{
end = i;
string temp = s.substr(begin,end - begin);
cout << temp << endl;
begin = i + 1;
vec.push_back(temp);
max_size = temp.size() > max_size ? temp.size() : max_size;
}
}
string temp = s.substr(begin,s.size() - begin);
vec.push_back(temp);
max_size = temp.size() > max_size ? temp.size() : max_size;
for(size_t i = 0;i < max_size;++i)
{
string contemp;
for(size_t j = 0; j < vec.size();++j)
{
if(j < vec.size() && i < vec[j].size())
contemp.push_back(vec[j][i]);
else
contemp.push_back(' ');
}
res.push_back(contemp);
}
for(size_t i = 0;i < res.size();++i)
{
int end = res[i].size() - 1;
while(res[i][end] == ' ')
{
end--;
}
res[i] = res[i].substr(0,end + 1);
}
return res;
}
};