标签:151 单词 index newArr --- 字符串 prev 空格 LeetCode
151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 1:
输入:“the sky is blue”
输出:“blue is sky the”
示例 2:
输入:" hello world! "
输出:“world! hello”
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入:“a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路:
开辟一个和原字符串大小相同的数组用来存储翻转后字符串。
从原字符串尾部开始向前寻找,查找到一个单词后放入新数组。
这种解法需要 O(N) 的空间复杂度。
代码示例:
char* reverseWords(char* s)
{
int len = strlen(s);
//新数组
char* newArr = (char*)malloc(sizeof(char) * len + 1);
int prev = len - 1; //每个单词的头
int tail = prev; //每个单词的尾
int cur = 0; //临时记录
int index = 0; //新数组的索引
while (prev >= 0) //小于0停止拷贝
{
if (s[prev] == ' ') //遇到非空格停止,找到单词尾部
{
prev--;
}
else
{
tail = prev; //记录尾部
while (prev >= 0 && s[prev] != ' ') //移动,寻找头部 注意prev越界
{
prev--;
}
cur = prev + 1; //prev此时指向' ',+1让cur指向单词头字母
while (cur <= tail)
{
newArr[index++] = s[cur++]; //复制单词
}
newArr[index++] = ' '; //在每个单词后添加' '
}
}
if (index > 0 && newArr[index - 1] == ' ') //注意补上字符串的结尾 \0
{
newArr[index - 1] = 0;
}
else //这是全是空格的情况
{
newArr[index] = 0;
}
return newArr;
}
标签:151,单词,index,newArr,---,字符串,prev,空格,LeetCode 来源: https://blog.csdn.net/juggte/article/details/116275200
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。