android 通讯录搜索算法,一个简单的通讯录联系人拼音匹配算法
這是很久以前遇到一個面試題,通訊錄聯(lián)系人拼音匹配算法,題目描述如下:
在通訊錄里搜索聯(lián)系人里,用戶習(xí)慣使用拼音縮寫,我們定義如下的搜索匹配規(guī)則:
以搜索王海寶(WangHaiBao)為例,如下輸入均能夠匹配到該人(注意:舉例只是為閱讀方便,實際實現(xiàn)不區(qū)分大小寫):
1)每字的首字母縮寫:W,WH,WHB
2)每字或者全拼或者首字母:WH,WangH符合規(guī)則,但WanH,WanH,WangHaB不可
3)要順序出現(xiàn):WHB可以,HB,HBao不可
4)最后的輸入部分可以是部分:WHBa,但WHBo不可
請編程實現(xiàn)該匹配算法,要求:
1)根據(jù)上述要求,自己總結(jié)規(guī)則、描述算法并給出測試案例
2)可使用任何語言;如果使用C/C++,函數(shù)原型如下:
bool match(const char *source[], const char *input),其中:
source是姓名所含各字的拼音。
示例如下:假設(shè)source={"wang","hai","bao",null},則
match(source,"whb")=true;
match(source,"whba")=true;
match(source,"wanhb")=false;
題目描述的使用場景很常見,在通訊錄輸入漢字的拼音或者拼音的首字母,查找相匹配的聯(lián)系人姓名。
中文聯(lián)系人姓名一般都是由多個漢字組成,只要做到每個漢字的拼音都被順序匹配,那么這個聯(lián)系人就和拼音匹配的。所以我們可以將多個漢語拼音的順序匹配分解為 單個漢語拼音的匹配的與運(yùn)算(&)。
#include
#include
#include
#import
using namespace std;
/**
匹配 遞歸調(diào)用,相當(dāng)于每次都是新的狀態(tài)
@param source 每次source+1
@param input input指針前移
@param len 長度減去已經(jīng)匹配的長度
@return 是否匹配
*/
bool match(const char *source[], const char *input, long len){
if (source == NULL || *source == NULL) {
return false;
}
if (input == NULL || len <= 0) {
return false;
}
const char** p_src = source;
char in_f_c = input[0];
char src_f_c = p_src[0][0];
const char* word = p_src[0];
long word_len = strlen(word);
if (in_f_c == src_f_c) {
//input只有一個字符
if (len == 1) {
return true;
}
//漢字的拼音只有一個字符
if (word_len == 1) {
if (word_len == len) {//如果input也只有一個匹配
return true;
}
//這次匹配完成 跳到下一個漢字匹配狀態(tài)
return match(p_src+1, input+1, len - 1);
}
//最后一個漢字的拼音,支持頭匹配
if (*(source + 1) == NULL) {
//如果input的長度大于最后一個漢字的長度,不匹配
if (word_len < len) {
return false;
}
//判斷 input剩余的串是否和最后一個漢字頭匹配
if (strncmp(word + 1, input + 1, len - 1) == 0) {
return true;
}
}else{
//判斷拼音首字母之外的字母是否匹配
if (strncmp(word + 1, input + 1, word_len - 1) == 0) {//匹配
//如果拼音的長度和input的長度一樣,匹配成功
if (word_len == len) {
return true;
}
//進(jìn)入下個漢字拼音匹配狀態(tài), input增加word_len長度
bool ret = match(p_src + 1, input + word_len, len - word_len);
if (!ret) {
return match(p_src + 1, input + 1, len - 1);
}else {
return ret;
}
}else {
//進(jìn)入下個漢字拼音匹配狀態(tài), input增加1
return match(p_src + 1, input + 1, len - 1);
}
}
}
return false;
}
bool match(const char *source[], const char *input){
string str = string(input);
transform(str.begin(), str.end(), str.begin(), (int (*)(int))tolower);
return match(source, str.c_str(), str.length());
}
int main(int argc, const char * argv[]) {
//特殊用例測試
const char* source1[] = {"wan", "an", "gang", NULL};
cout<< match(source1, "wang")<
//題目測試用例
const char* source[] = {"wang", "hai", "bao", NULL};
cout<< match(source, "whb")<
cout<< match(source, "whba")<
cout<< match(source, "WHBo")<
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的android 通讯录搜索算法,一个简单的通讯录联系人拼音匹配算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟化工具Xen的安装配置详解
- 下一篇: 时间换算 将毫秒换算成时间