151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入: "the sky is blue",
输出: "blue is sky the".
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
java解法:
用split函数切割字符串转化为字符串数组
public class Solution {
public String reverseWords(String s) {
if(s.length() == 0 || s == null){
return "";
}
String[] array = s.split(" ");
StringBuilder sb = new StringBuilder();
for(int i = array.length - 1; i >= 0; i--){
if(!array[i].equals("")) {
if (sb.length() > 0) {
sb.append(" ");
}
sb.append(array[i]);
}
}
return sb.toString();
}
}
C++
class Solution {
public:
void reverseWords(string &s) {
string res = "";
int i = s.length() - 1;
while(i >= 0) {
while(i >= 0 && s[i] == ' ') {
i--;
}
if(i < 0) {
break;
}
if(res.length() != 0) {
res.push_back(' ');
}
string temp = "";
while(i >= 0 && s[i] != ' ') {
temp = s[i] + temp;
i--;
}
res.append(temp);
}
s = res;
}
};
class Solution {
public:
void reverseWords(string &s) {
//string res = "";
int n = s.size();
int i = 0, j = 0, start = 0;
while(i < n) {
while(i < n && s[i] == ' ') {
i++;
}
if(i < n && j > 0) {
s[j++] = ' ';
}
start = j;
while(i < n && s[i] != ' ') {
s[j++] = s[i++];
}
reverse(s.begin() + start, s.begin() + j);
}
s.resize(j);
reverse(s.begin(), s.end());
}
};
C语言
参考:https://leetcode.com/problems/reverse-words-in-a-string/discuss/47988/0-ms-easy-solution-in-C
void reverse(char *start,char *end)
{
while(end > start)
{
char temp = *start;
*start = *end;
*end = temp;
start++,end--;
}
}
void trim(char *S)
{
int count = 0;
int N = strlen(S);
int flag = 1;
for(int i=0;i<N;i++)
{
if(S[i] != ' ')
{
S[count++] = S[i];
flag = 0;
}
else
{
if(!flag)
{
S[count++] = S[i];
flag = 1;
}
}
}
if(count >= 1 && S[count-1] == ' ')
S[count-1] = '\0';
else
S[count] = '\0';
}
void reverseWords(char *S)
{
trim(S);
char *temp = S,*prev = S;
while(*temp)
{
temp++;
if(*temp == ' ')
{
reverse(prev,temp-1);
prev = temp+1;
}
else if(*temp == '\0')
{
reverse(prev,temp-1);
}
}
reverse(S,temp-1);
}
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size() - 1;
char temp;
while(i < j) {
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
};
557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string reverseWords(string s) {
string res = "";
int start = 0, end = 0;
for(int i = 0; i < s.size(); i++) {
string temp = "";
while(s[i] != ' ' && s[i] != '\0') {
temp += s[i];
i++;
}
end = i - 1;
reverse(temp.begin(), temp.end());
start = i + 1;
res += temp;
if(i != s.size()) {
res += " ";
}
}
return res;
}
};