字符串
leetcode151:反转字符串中的单词
class Solution{
public:
void removeExtraSpaces(string& s)
{
int slow = 0;//定义一个慢指针负责控制单词的左边界;
for(int i = 0; i < s.size(); i++)//i负责寻找单词并拷贝给slow;
{
if(s[i] != ' ')//当寻找到单词时进行操作;
{
if(slow != 0)//首先判断slow是否位于开头,
s[slow++] = ' ';//如果不是位于开头先加一个空格,在后移等待字母拷贝;
while(i <s.size() && s[i] != ' ')//字母拷贝过程,只要没遇到空格且没走到
s[slow++] = s[i++];//字符串结尾,则一直进行拷贝;
}
}
s.resize(slow);//比较巧妙的是slow恰好可以反映新的s的大小;
}
void reverse(string& s, int start, int end)
{
for(int i = start, j = end; i < j; i++, j--)
swap(s[i], s[j]);//这是左闭右闭的区间翻转;
}
string reverseWords(string s)
{
removeExtraSpaces(s);//先移除多余的空格;
reverse(s, 0, s.size() - 1);//再将字符串整体翻转;
int start = 0;
for(int i = 0; i <= s.size(); i++)//再翻转里面的每个单词;
{
if(s[i] == ' ' || i = s.size())//碰到空格或者字符串末尾都是单词结束的标志;
reverse(s, start, i - 1); //注意此处是 i - 1,因为翻转用的左闭右闭;
}
return s;
}
};
leetcode28:KMP
class Solution{
public:
void getNext(int next[], string s)
{
int j = 0;//初始化j和next数组;
next[0] = 0;
for(int i = 1; i < s.size(); i++)
{
while(j > 0 && s[i] != s[j])//如果不相等,则j要回退,回退回前一个表示的值;
j = next[j - 1];//因为是连续回退,所以要用while;
if(s[i] == s[j])//如果相等,则说明最大公共前后缀可以增加;
j++;//后面的最大公共前后缀可以用到前面的,所以j++;
next[i] = j;//i处的最大公共前后缀可以固定下来;
}
}
int strStr(string haystack, string needle)
{
int next[needle.size()];
getNext(next, needle);
for(int i = 0, j = 0; i < haystack.size(); i++)
{
while(j > 0 && haystack[i] != needle[j])
j = next[j - 1];
if(haystack[i] == needle[j] && j < needle.size())
j++;
if(j == needle.size())
return i - j + 1;
}
return -1;
}
};