题目
- A、B、C 是 3 个字符串。把 A 中包含的所有 B 都替换为 C,如果替换以后还有 B 就继续替换,直到 A 不包含 B 为止。
-
- 请编写程序实现以上功能。不允许使用系统提供的字符串比较、查找和替换函数。
-
- 以上程序是否总是能正常输出结果?如果不是,列出哪些情况下无法正常输出结果,尽可能详细和全面。
完全不会这样的题目, 但是可以看出是个算法题, 不能查找字符串是很艰难的一部分
解决方案
字符串替换需要 用KMP或者BF算法
js
// KPM算法
// 获取部分匹配值表
function initTable( str ){
let arr = str.split('');// 转为数组
let table = [];
// 获得部分匹配值
// 输入字符串 输出共有元素的长度
function _getFitValue( partString ){
let partFitValue = 0;
let prefixArr = []; // 前缀数组
let suffixArr = []; // 后缀数组
// 获得两个数组中重复元素的长度
function _getSameLength( arr1, arr2 ){
for(let i of arr1){
for(let j of arr2){
if(i==j){
console.log('相同元素', i)
return i.length;
}
}
}
return 0;
}
// 获得双份数组
if( partString.length > 2 ) {
for ( let i = 1; i < partString.length ; i++ ) {
let j = partString.length - i;
prefixArr.push( partString.substr( 0, i ) );
suffixArr.push( partString.substr( i, j ) );
}
console.log('prefixArr',prefixArr);
console.log('suffixArr',suffixArr);
partFitValue = _getSameLength( prefixArr, suffixArr );
return partFitValue;
} else {
return partFitValue;
}
}
for( let i = 0; i < arr.length; i++ ) {
let testStr = str.substr(0,i+1);
console.log('testStr', testStr)
table[i] = _getFitValue( testStr );
}
return table;
};
let table = initTable('ABCDABD');
console.log('table', table);
// KMP 算法从一个字符串a中获取另一个字符串b的第一份索引 b的字符串在a中的索引值 如果没有返回-1
function KMP(sourceStr, searchStr) {
//生成匹配表
let part = initTable(searchStr);
let sourceLength = sourceStr.length;
let searchLength = searchStr.length;
let result;
let i = 0;
let j = 0;
for (; i < sourceStr.length; i++) { //最外层循环,主串
//子循环
for (j = 0; j < searchLength; j++) {
//如果与主串匹配
if (searchStr.charAt(j) === sourceStr.charAt(i)) {
//如果是匹配完成
if (j == searchLength - 1) {
result = i - j;
break;
} else {
//如果匹配到了,就继续循环,i++是用来增加主串的下标位
i++;
}
} else {
//在子串的匹配中i是被叠加了
if (j > 1 && part[j - 1] > 0) {
i += (i - j - part[j - 1]);
} else {
//移动一位
i = (i - j)
}
break;
}
}
if (result || result === 0) {
break;
}
}
if (result || result == 0) {
return result
} else {
return -1;
}
}
let index = KMP('BBC ABCDAB ABCDABCDABDE','ABCDABD');
function replaceString( a, b, c ){
while(true){
let num = KMP( a, b );// 这里原先使用indexOf() 但是这样就用了题目中的查找字符串的方法
if( num !== -1 ){
let a_chars = a.split('');
a = "";
let count = 0;
for ( let i = 0; i < a_chars.length; i++ ) {
if( i >= num && (i < num + b.length)){
if( count === 0 ) {
a = a + c;
}
count++;
} else {
a = a + a_chars[i];
}
}
} else {
return a;
}
}
}
// 无法计算的情况:会陷入死循环 替换的c 包含b中的内容 但是同样是符合题意的
replaceString('cccccc','c','bc');
引用