# 1. 两个字符串相同的最大子串

需求场景:
app、小程序、网页定位中,同一个小区,不同楼栋、门店定位名称不一样,需要从中自动提取小区名称。

案例演示:

'华侨国际城','华侨国际城凯佳宾馆'  
=> 提取:华侨国际城            

'武汉华侨国际城','解放大道华侨国际城凯佳宾馆'   
=> 提取:华侨国际城

'武汉状元城宾馆','解放大道武汉华侨国际城凯佳宾馆' 
=> 提取:武汉
//  原因:两个地址属于两个小区,向上提取更大范围 “武汉”

'武汉华侨国际城4栋','武汉解放大道华侨国际凯佳宾馆' 
=> 提取:华侨国际(便于模糊查询)

'华侨国际','武汉解放大道华侨国际凯佳宾馆'  
=> 提取:华侨国际

方法:

function getMaxStr(str1,str2){
    var max = str1.length > str2.length ? str1 : str2;
    var min = (max == str1 ? str2 : str1);
    for(var i = 0; i < min.length; i++){
        for(var x = 0, y = min.length - i;y != min.length + 1;x++,y++){
            //y表示所取字符串的长度
            var newStr = min.substring(x,y);
            //判断max中是否包含newStr
            if(max.indexOf(newStr) != -1){
                return newStr;
            }
       }
   }
   return -1;
}
console.log(getMaxStr('华侨国际城','华侨国际城凯佳宾馆'));//华侨国际城
console.log(getMaxStr('武汉华侨国际城','解放大道华侨国际城凯佳宾馆'));//华侨国际城
console.log(getMaxStr('武汉状元城宾馆','解放大道武汉华侨国际城凯佳宾馆'));//武汉
console.log(getMaxStr('武汉华侨国际城4栋','武汉解放大道华侨国际凯佳宾馆'));//华侨国际
console.log(getMaxStr('华侨国际','武汉解放大道华侨国际凯佳宾馆'));//华侨国际

升级方法:

function extractCommunityName(address1, address2) {
    // 找出两个字符串的最长公共子串
    function findLongestCommonSubstring(str1, str2) {
        let maxLen = 0;
        let endIndex = 0;
        let dp = Array.from({ length: str1.length + 1 }, () => Array(str2.length + 1).fill(0));

        for (let i = 1; i <= str1.length; i++) {
            for (let j = 1; j <= str2.length; j++) {
                if (str1[i - 1] === str2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    if (dp[i][j] > maxLen) {
                        maxLen = dp[i][j];
                        endIndex = i - 1;
                    }
                }
            }
        }

        return str1.substring(endIndex - maxLen + 1, endIndex + 1);
    }

    // 提取小区名称
    const commonSubstring = findLongestCommonSubstring(address1, address2);

    // 如果公共子串为空,说明两个地址不属于同一个小区,返回更大的范围
    if (!commonSubstring) {
        // 这里可以根据需求返回更大的范围,比如城市名称
        return address1.split(' ')[0] || address2.split(' ')[0];
    }

    return commonSubstring;
}

// 测试案例
console.log(extractCommunityName('华侨国际城', '华侨国际城凯佳宾馆')); // 输出: 华侨国际城
console.log(extractCommunityName('武汉华侨国际城', '解放大道华侨国际城凯佳宾馆')); // 输出: 华侨国际城
console.log(extractCommunityName('武汉状元城宾馆', '解放大道武汉华侨国际城凯佳宾馆')); // 输出: 武汉
console.log(extractCommunityName('武汉华侨国际城4栋', '武汉解放大道华侨国际凯佳宾馆')); // 输出: 华侨国际
console.log(extractCommunityName('华侨国际', '武汉解放大道华侨国际凯佳宾馆')); // 输出: 华侨国际

// 代码说明:
// findLongestCommonSubstring:这个函数用于找出两个字符串的最长公共子串。它使用动态规划的方法来求解。

// extractCommunityName:这个函数调用findLongestCommonSubstring来获取两个地址的最长公共子串。如果公共子串为空,说明两个地址不属于同一个小区,返回更大的范围(如城市名称)。

// 注意事项:
// 这个方法假设小区名称是地址中最长的公共子串。如果地址中包含其他公共信息(如城市名称),可能需要进一步处理。

// 如果两个地址属于不同的小区,返回更大的范围(如城市名称)。你可以根据实际需求调整这个逻辑。

// 这个方法可以处理大部分情况,但如果地址格式非常复杂,可能需要进一步优化或结合其他方法(如正则表达式)来处理。

# 2. 最近距离排序

需求场景:
需要根据每个人离我的远近依次排序,我们所有人基于同一个参考点

案例演示:

我自己距离参考点:500米,其他人距离参考点600,650米,700米等等,
求此时其他人离我的位置由近及远排序
数据模型:
let me = { name:'我', pointer:500 }
let orthers = [
    { name:'梁咏琪', pointer:550 },
    { name:'杨超越', pointer:600 },
    { name:'迪丽热巴', pointer:505 },
    { name:'古力娜扎', pointer:650 },
    { name:'古巨基', pointer:700 },
    { name:'刘德华', pointer:451 },
    { name:'古天乐', pointer:180 },
]

方法:

function sortPointer(arr,info){
    return  arr.sort(
       (a,b)=> Math.abs(a.pointer - info.pointer) - Math.abs(b.pointer - info.pointer)
    ).map(item => (
        {
            ...item,
            distance:Math.abs(item.pointer - info.pointer) //距离我多远
        }
    ));
}

let me = { name:'我', pointer:500 }
let orthers = [
    { name:'梁咏琪', pointer:550 },
    { name:'杨超越', pointer:600 },
    { name:'迪丽热巴', pointer:505 },
    { name:'古力娜扎', pointer:650 },
    { name:'古巨基', pointer:700 },
    { name:'刘德华', pointer:451 },
    { name:'古天乐', pointer:180 },
]
let resArr = sortPointer(orthers,me);
console.log(resArr);
//返回
[
    { "name": "迪丽热巴","pointer": 505,"distance": 5},
    { "name": "刘德华", "pointer": 451,"distance": 49},
    { "name": "梁咏琪", "pointer": 550, "distance": 50},
    { "name": "杨超越","pointer": 600,"distance": 100},
    { "name": "古力娜扎","pointer": 650,"distance": 150},
    { "name": "古巨基", "pointer": 700,"distance": 200 },
    { "name": "古天乐", "pointer": 180,"distance": 320 }
]
更新时间: 2025年2月15日星期六晚上7点14分