微软面试题:求两个字符串的最大子字符串
2009-01-09 11:18
246 查看
我也写了一个,感觉效率不错,不递归,不使用正则,如果有多个相同长度的最大子字符串,则输出全部子串.
字符串1:
字符串2:
PS: 不输入可以运行测试
function maxSubString(a,b)
{
var cancu_count = 0;
var len_a = a.length,len_b = b.length,sum_len=len_a+len_b,k=0,max=[],count=0;
if(len_a>len_b)
{
var c = a;
a = b;
b = c;
len_a = sum_len - len_a;
len_b = sum_len - len_b;
}
var arr_a = a.split("");
var arr_b = b.split("");
offset_a=len_a-1,offset_b = 0;
for(var i=0;i len_b - 1)
k--;
var temp_start = -1,temp_count = 0;
for(var m=0;m count)
max = [];
if(m==k-1 && temp_count >= count)
{
max.push([temp_start,temp_count]);
count = temp_count;
}
}
else
{
if(temp_start > -1 && temp_count >= count)
{
max.push([temp_start,temp_count]);
count = temp_count;
}
temp_count = 0;
temp_start = -1;
}
}
if(i0)
offset_a--;
if(i>=len_a-1 && offset_b < len_b -1)
offset_b++;
}
var max_str = [];
for(var i=0;i0)
{
for(var k = 0;k0)
alert(a + '与 '+ b +' 的最长子串是: '+maxSubString(a,b));
else
{
for(var i=0;i
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
跟上面那个比较起来,下面这个算法先计算较大的字串,感觉效率上应该更高一些,特别是相似度较高的字串,猜想一下,对于中文分词算法,为什么会有"反向最大匹配"一说呢, 比如,打架,打的,显示,后面一个字对会词汇的含义有决定作用,所以要反向匹配,不知道这样理解是否正确。
字符串1:
字符串2:
PS: 不输入可以运行测试
function maxSubString(a, b) {
var msg ='';
if (a == b) return a;
var _a, _b, _lena, _lenb;
if (a.length > b.length) {
var t = a;
a = b;
b = t;
t = null;
}
if (a.length == 1)
return a;
if(b.indexOf(a) > -1)
return a;
var _s = [];
for (var k = a.length - 1,m = 2; k > 0; k--, m++) {
msg+='比较测试字串长度: ' + k + ', 测试次数: ' + m +'
';
for (var i = 0; i < m; i++) {
_s.push(a.substring(i, i+k));
msg +='k='+k+ ',当前片段: ' + a.substring(i,i+ k) + '
';
}
var re = [];
for (var t = 0; t < _s.length; t++) {
if (b.indexOf(_s[t]) > -1) {
if(re.length == 0)
re.push(_s[t]);
else
{
var exits = false;
var n=0;
while(!exits && n匹配成功: '+_s[t]+'
';
msg+='结果长度: '+re.length + '
';
}
}
if (re.length > 0)
{
document.getElementById('msg_box').innerHTML += msg + "";
return re.join(',');
}
}
return 'not found!';
}
function canculate()
{
var test_data = [['12-bcd-12345-dd----', 'abcd--123--1234'], ['1234', '123'], ['abbccdd', '1ccbbaa'], ['abbbcc', '1ccbbba']];
var result = [];
if(document.getElementById('a').value.length == 0)
{
for(var i=0;i
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
字符串1:
字符串2:
PS: 不输入可以运行测试
function maxSubString(a,b)
{
var cancu_count = 0;
var len_a = a.length,len_b = b.length,sum_len=len_a+len_b,k=0,max=[],count=0;
if(len_a>len_b)
{
var c = a;
a = b;
b = c;
len_a = sum_len - len_a;
len_b = sum_len - len_b;
}
var arr_a = a.split("");
var arr_b = b.split("");
offset_a=len_a-1,offset_b = 0;
for(var i=0;i len_b - 1)
k--;
var temp_start = -1,temp_count = 0;
for(var m=0;m count)
max = [];
if(m==k-1 && temp_count >= count)
{
max.push([temp_start,temp_count]);
count = temp_count;
}
}
else
{
if(temp_start > -1 && temp_count >= count)
{
max.push([temp_start,temp_count]);
count = temp_count;
}
temp_count = 0;
temp_start = -1;
}
}
if(i0)
offset_a--;
if(i>=len_a-1 && offset_b < len_b -1)
offset_b++;
}
var max_str = [];
for(var i=0;i0)
{
for(var k = 0;k0)
alert(a + '与 '+ b +' 的最长子串是: '+maxSubString(a,b));
else
{
for(var i=0;i
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
跟上面那个比较起来,下面这个算法先计算较大的字串,感觉效率上应该更高一些,特别是相似度较高的字串,猜想一下,对于中文分词算法,为什么会有"反向最大匹配"一说呢, 比如,打架,打的,显示,后面一个字对会词汇的含义有决定作用,所以要反向匹配,不知道这样理解是否正确。
字符串1:
字符串2:
PS: 不输入可以运行测试
function maxSubString(a, b) {
var msg ='';
if (a == b) return a;
var _a, _b, _lena, _lenb;
if (a.length > b.length) {
var t = a;
a = b;
b = t;
t = null;
}
if (a.length == 1)
return a;
if(b.indexOf(a) > -1)
return a;
var _s = [];
for (var k = a.length - 1,m = 2; k > 0; k--, m++) {
msg+='比较测试字串长度: ' + k + ', 测试次数: ' + m +'
';
for (var i = 0; i < m; i++) {
_s.push(a.substring(i, i+k));
msg +='k='+k+ ',当前片段: ' + a.substring(i,i+ k) + '
';
}
var re = [];
for (var t = 0; t < _s.length; t++) {
if (b.indexOf(_s[t]) > -1) {
if(re.length == 0)
re.push(_s[t]);
else
{
var exits = false;
var n=0;
while(!exits && n匹配成功: '+_s[t]+'
';
msg+='结果长度: '+re.length + '
';
}
}
if (re.length > 0)
{
document.getElementById('msg_box').innerHTML += msg + "";
return re.join(',');
}
}
return 'not found!';
}
function canculate()
{
var test_data = [['12-bcd-12345-dd----', 'abcd--123--1234'], ['1234', '123'], ['abbccdd', '1ccbbaa'], ['abbbcc', '1ccbbba']];
var result = [];
if(document.getElementById('a').value.length == 0)
{
for(var i=0;i
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
相关文章推荐
- 求两个字符串最大公共字符串(听说是微软几年前面试题)
- 面试题七 C/C++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题
- 求出两个字符串中最大长度的相同的子字符串
- 常见C语言面试题之五:两个字符串的最大公共子字符串
- iOS 算法面试题(打印2-100之间的素数、求两个整数的最大公约数、查找字符串的位置)~demo
- 求两个字符串之间的最大相同的最大子字符串!!
- 面试题之求两个字符串的最大公共子串
- 程序员面试题精选100题(46)-对称子字符串的最大长度[算法]
- 计算两个字符串最大公有子串
- Java语言实现查找两个字符串的最大公共字串
- 两个字符串的最大公共子长度
- 找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
- 微软等名企面试题3--字符串专题
- 面试题之两个字符串
- 两个字符串中最大相同的子串
- 微软面试题系列(三):求子数组的最大和
- 匹配两个字符串中,相同且最长的子字符串
- 求两个字符串的最大相同子串
- 找出两个字符串中最大公共子字符串,如"abccade"、"dgcadde"的最大子串为"cad"
- 面试题12:字符串无重复子串的最大长度