leecode151. 颠倒字符串中的单词
这个题目我第一反应就是用堆和栈来做,因为反转的东西都可以用堆栈来做。
class Solution {
public:
string reverseWords(string s) {
stack<string> st;
string dstStr;
char* tmpStr = strtok(s.data(), " ");
while(tmpStr != NULL){
st.push(tmpStr);
tmpStr = strtok(NULL," ");
}
string ans;
while(!st.empty()){
ans += st.top();
ans +=" ";
st.pop();
}
ans = ans.substr(0,ans.size()-1);
return ans;
}
};
代码简介高效,当然代码随想录也介绍了一种比较不错想法,虽然快而且易懂,但是我觉得这个想法的代码有点复杂。大家也可以看看。
代码随想录
剑指 Offer 58 - II. 左旋转字符串
这道题也是参考代码随想录的方法来刷的,而且算法复杂度为n,利用的额外空间为0.并且最主要的是,代码非常简介。代码随想录
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(), s.end());
return s;
}
};
leecode14. 最长公共前缀
此题最开始的写法也是用暴力写法写,但是如果单词很多的话,算法复杂度会飙升。所以我看了评论区,觉得有一个方法非常简单,而且好理解。
1.先把所有元素按照字典顺序排序。
2.比较容器中的第一个元素和最后一个元素
3.这样便可以得到最长公共前缀,为什么呢,因为当字符按照字典排序过后,如果第一个和最后一个字符串的第一个字母相同,那就证明中间的所有字符串的第一个字母与他都是相同的,此解法甚为精妙
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
sort(strs.begin(), strs.end());
string s1 = strs.front();
string s2 = strs.back();
int i = 0;
string s = "";
int count = 0;
while(i < s1.size() && i < s2.size() && s1[i] == s2[i]){
count++;
i++;
}
return s1.substr(0,count);
}
};