python反转字符串中的单词_LeetCode 557:反转字符串中的单词 III Reverse Words in a String III...

爱写bug(ID:icodebugs)

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

示例 1:输入: "Let's take LeetCode contest"

输出: "s'teL ekat edoCteeL tsetnoc"

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

Note: In the string, each word is separated by single space and there will not be any extra space in the string.

解题思路:

每次遇到空格字符,就把 从上一次空格字符开始到该空格字符止之间的所有字符反转一下即可,只需要注意最后一个字符结束时,并不是空格字符,要再加一个判断是否是已经索引到最后一位。'abc def'                               原字符串

['a' , 'b' , 'c' , '  ' , 'd' , 'e' ,'f']             转成char[]型数组

['c' , 'b' , 'a' , '  '...]                  遍历数组,遇到第一个空格,把该空格到上个空格之间的字母反转

[... '  ' ,  'd' , 'e' ,'f']                 遍历到最后一位,不是空格,依然要反转到前一个空格间的字母

[... '  ' ,  'f' , 'd' ,'e']                 反转

'cba fde'                               转成字符串输出

Java:class Solution {

public String reverseWords(String s) {

int sLen = s.length(), k = 0, j = 0;//j记录空格字符前的索引位置

char strs[] = s.toCharArray(), temp;//转为字符数组

for (int i = 0; i 

if (strs[i] == ' ') j = i - 1;//遇到空格字符j值减1,为截取的字母段的最后一个字母的索引

else if (i == sLen - 1) j = i;//如果到最后一位,则j值不应该再减1

else continue;

for (; j >= k; j--, k++) {//交换位置

temp = strs[j];

strs[j] = strs[k];

strs[k] = temp;

}

k = i + 1;//k记录空格字符后的索引位置

}

return String.valueOf(strs);

}

}

python不再复现上述定义指针解题的思路,这里再次投机取巧,利用 python 切片特性及 split() 、join() 函数解题,解题思路:'abc def gh'                原字符串

'hg fed cba'                切片特性反转字符串

['hg'  , 'fed' , 'cba']             split()分割字符串

['cba' , 'fed' , 'hg']              切片反转数组

'cba fed hg'                拼接成字符串

Python3:class Solution:

def reverseWords(self, s: str) -> str:

return ' '.join(s[::-1].split()[::-1])

KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值