博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】拼音匹配算法
阅读量:6358 次
发布时间:2019-06-23

本文共 2648 字,大约阅读时间需要 8 分钟。

之前一直想做个通讯录程序,和音乐快速搜索程序,需要使用到汉字注音,还有字符串快速匹配。

可一直没有找到高效率的算法,普通的字符串匹配算法速度太慢,如何才能在最短的时间内匹配出需要的字符串,这个问题困惑了几个星期,今天把字符串匹配算法共享出来,具体效果跟QQ通讯录查找联系人的时候差不多

测试:

  测试字符串:        string[] pinyin = {"chen", "neng", "guang"}

  测试Key:    "chng"  "chnengguang"  "cheng"  "chenengua"

基本思想:

  从Key的第一个字符开始,在字符串数组的第一个pinyin[0] 开始匹配

    1、当遇到追尾(字符串尾) 或 不匹配时

      跳到下一个拼音(如:pinyin[1])开始匹配

      1、不匹配时:

        使测试Key回退一个字符再进行匹配,匹配不完成,则继续回退,若回到第一个字符还是不匹配,则返回false

      2、匹配时:

        继续往下匹配

    2、继续匹配

图解: 

代码(C#)

public static bool PinyinMatch(string search, string[] pinyin)        {            int wordIndex = 0;            int wordStart = 0;            int searchIndex = 0;            int pinyinLen = pinyin.Length;            while (searchIndex < search.Length && wordIndex < pinyinLen)            {                //不追尾,判断是否匹配                if (wordStart < pinyin[wordIndex].Length && search[searchIndex] == pinyin[wordIndex][wordStart])                {                    searchIndex++;                    wordStart++;                }                //追尾或匹配失败                else                {                    //到最后一个拼音,无法匹配                    if (wordIndex == pinyinLen - 1)                    {                        return false;                    }                    wordIndex++;                    wordStart = 0;                    //判断是否匹配                    if (search[searchIndex] == pinyin[wordIndex][wordStart])                    {                        searchIndex++;                        wordStart++;                    }                    //不匹配,回退                        //补充(未完成):回退到最左边一个字符,pinyins可以向后跳一位                    else                    {                        if (searchIndex > 0)                        {                            searchIndex--;                            //判断是否匹配                            while (searchIndex >= 0 && search[searchIndex] != pinyin[wordIndex][0])                            {                                searchIndex--;                            }                            if (searchIndex < 0)                            {                                searchIndex = 0;                                wordIndex++;                                wordStart = 0;                            }                            else                            {                                searchIndex++;                                wordStart++;                            }                        }                    }                }            }            if (searchIndex == search.Length)            {                return true;            }            return false;        }

 

    

  

转载地址:http://infma.baihongyu.com/

你可能感兴趣的文章
jdbc 简单连接
查看>>
Activiti 实战篇 小试牛刀
查看>>
java中的Static class
查看>>
[工具类]视频音频格式转换
查看>>
GNS3与抓包工具Wireshark的关联
查看>>
groovy-语句
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>
Silverlight 5 beta新特性探索系列:10.浏览器模式下内嵌HTML+浏览器模式下创建txt文本文件...
查看>>
YourSQLDba 配置——修改备份路径
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>
ES6 - 函数与剩余运算符
查看>>
你对position了解有多深?看完这2道有意思的题你就有底了...
查看>>
WebSocket跨域问题解决
查看>>
世界经济论坛发布关于区块链网络安全的报告
查看>>
巨杉数据库加入CNCF云原生应用计算基金会,共建开源技术生态
查看>>
Ubuntu 16.04安装Nginx
查看>>
从 JS 编译原理到作用域(链)及闭包
查看>>