竖直打印单词--暴力模拟的思路

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;
    }
};

具体的细节久看基本功了。

然后事实是这样的:
竖直打印单词--暴力模拟的思路_第1张图片
说明,只要题目数据量不是很大,放心的去模拟吧!!!

ATFWUS  --Writing  By 2020–03–19

你可能感兴趣的:(算法)