从一个字符串中删除另一个字符串
2018-01-12 12:13
190 查看
题目:两个字符串A、B,从A中剔除存在于B中的字符。比如A=“hello world”,B=”er”,那么剔除之后A变为”hllowold”。空间复杂度要求是O(1),时间复杂度越优越好。
第一种思路:hash+双指针。
对需要剔除的字符串做hash处理,查询复杂度为O(1), 字符总数为128, 所以空间复杂度为O(1).
双指针用于对对初始串的替换,在O(n)时间内完成替换,方法是设置两个指针: fast 和 slow。当碰到不是需要剔除的字符时,将fast指针指向的内容赋给slow,fast和slow都向前走一步;当碰到的是需要剔除的字符是,就fast指针向前走一步。
#include <iostream>
#include <string>
using namespace std;
void getHash(const string &str, int arr[]){
if(str.empty())
return ;
for(int i = 0; i < str.length(); i++){
arr[str[i]] = 1;
}
}
void deleteStr(string &str, const int arr[]){
if(str.empty())
return ;
char *fast = &str[0];
char *slow = &str[0];
while(*fast != '\0'){
if(arr[*fast] == 0){
*slow = *fast;
slow++;
}
fast++;
}
*slow = '\0';
}
int main(){
int hashArr[128];
memset(hashArr, 0, sizeof(hashArr));
string pattern = "o";
string str = "I am a boy!";
cout << str << endl;
getHash(pattern, hashArr);
deleteStr(str, hashArr);
cout<< str.data() << endl;
return 1;
}
第二种思路:是采用数组形式来进行循环比较。
第一种思路:hash+双指针。
对需要剔除的字符串做hash处理,查询复杂度为O(1), 字符总数为128, 所以空间复杂度为O(1).
双指针用于对对初始串的替换,在O(n)时间内完成替换,方法是设置两个指针: fast 和 slow。当碰到不是需要剔除的字符时,将fast指针指向的内容赋给slow,fast和slow都向前走一步;当碰到的是需要剔除的字符是,就fast指针向前走一步。
#include <iostream>
#include <string>
using namespace std;
void getHash(const string &str, int arr[]){
if(str.empty())
return ;
for(int i = 0; i < str.length(); i++){
arr[str[i]] = 1;
}
}
void deleteStr(string &str, const int arr[]){
if(str.empty())
return ;
char *fast = &str[0];
char *slow = &str[0];
while(*fast != '\0'){
if(arr[*fast] == 0){
*slow = *fast;
slow++;
}
fast++;
}
*slow = '\0';
}
int main(){
int hashArr[128];
memset(hashArr, 0, sizeof(hashArr));
string pattern = "o";
string str = "I am a boy!";
cout << str << endl;
getHash(pattern, hashArr);
deleteStr(str, hashArr);
cout<< str.data() << endl;
return 1;
}
第二种思路:是采用数组形式来进行循环比较。
void squeeze2(char s1[], char s2[]) { int i, j, k; int instr2 = 0; for(i = j = 0; s1[i] != '\0'; i++) { instr2 = 0; for(k = 0; s2[k] != '\0' && !instr2; k++) { if(s2[k] == s1[i]) { instr2 = 1; } } if(!instr2) { s1[j++] = s1[i]; } } s1[j] = '\0'; }
相关文章推荐
- 从一个字符串删除另一个字符串
- 从一个字符串中删除另一个字符串中出现的字符
- 从一个字符串中删除另一个字符串
- 小米面试题 从一个字符串中删除在另一个字符串中出现的字符
- 从一个字符串中删除另一个字符串中出现的字符
- 从一个字符串中删除另一个字符串中出现过的字符
- 从一个字符串中删除另一个字符串中出现过的字符
- 华为机试模拟题--在一个字符串中删除去包含另一个字符串的所有的字符
- 从一个字符串(A)中删去另一个字符串(B)中已经出现的字符
- 在一个字符串中删除指定的字符 & 删除字符串中所有出现在另一个字符数组中的字符
- 数据结构 - 从一个链表中删除在另一个链表中的元素(C++)
- 从一个字符串中删除一个子串后返回该字符串和包含的子串的个数
- 每天一道LeetCode-----使用最少的操作将一个字符串转换成另一个字符串,只有插入,删除,替换三种操作
- C指针复制字符串从一个数组到另一个数组
- 【剑指offer】删除在另一个字符串中出现的字符
- 用java写关于删除一个字符串的字符以及删除一个字符串与另一个字符串中相同字符的问题
- OC-在一个字符串中查找另一个字符串的范围;从一个字符串中提取子串
- 编写一个函数,实现从一个字符串中,查找另一个字符串的位置(笔试题) 例如int func("12345", "34")返回值为2,即在2号位置找到字符串“34”。
- 从一个字符串中删除所有的某个字符
- sqlserver:将列更新从一个表传递到另一个表 删除一个表的重复记录