字符串类面试题型之二——字符串的包含

字符串类面试题型之二——字符串的包含

 

在笔试面试中,字符串类是经常重点考的题型。本系列是本人为了准备笔试与面试,综合各类书与博客,整理所得。

希望在此过程中,希望可以深刻理解各种题型,督促自己的学习进步,并且分享给大家。如有错误,非常希望得到指点,不甚感激。

 

题目描述:

给定一长字符串a和一短字符串b。请问,如何最快地判断出短字符串b中的所有字符串是否都在长字符串a中?

a:  abcd
b:  bcd

本题也是来自于《编程之法》,书中给出了4种方法。第一种还是蛮力轮询,是最直观,但是也是效率最低的方法。第二种是排序后轮询,但是此方法的效率依旧不高。第三种是素数相乘,使长字符串a中的每个字母与一个素数对应,再遍历a,把a中的每个字符串对应的素数相乘,得到一个整数。让短字符串b中的字母也对应相应的素数,再用b中的每个字母对应的素数除以上面得到的整数。如果有余数,说明结果为False,否则为Ture。它给出的第四种方法是位运算法,使用了一个散列表(hash table),本人使用了一长度为26的数组(也可以使用HashMap)来分别表示26个字母,记录a中是否出现了相应的字母,出现则标记,并对b进行遍历,判断每个字母是否被标记过。如果都被标记过,则b为a的子串。

实现代码如下:

int StringContain(char *si, char *s2) 
{ 
    int array[26] = {0}; 
    int len_a = strlen(s1); 
    int len_b = strlen(s2); 
    for(i=0; i<len_a; i++) 
    { 
        array[(s1[i] - 'A')] = 1; 
    } 
    for(i=0; i<len_b; i++) 
    { 
        if(array[s2[i] - 'A'] == 0) 
        { 
            printf("false"); return -1; 
        } 
    } 
    printf("true"); 
}

 

字符串包含,也还有一种题型,就是在字符串中查找子串,并且返回子串在字符串中第一次出现的位置。

此题型也是较为简单,使用两个数组进行轮询比较即可。

实现代码如下:

int strstr(const char *str1, const char *str2) 
{ 
    int i, j, len1, len2, firstplace; 
    if((str1 == NULL) && (str2 == NULL)) 
    { 
        return ; 
    } 
    len1 = strlen(str1); 
    len2 = strlen(str2); 
    for(i=0; i<(len1-len2); i++) 
    { 
        if(str1[i] == str2[0]) 
        { 
            for(j=0; j<len2; j++) 
            { 
                if(str1[i+j] != str2[j]) 
                { 
                    break; 
                }
            } 
            firstplace = i; 
        } 
    } 

    return firstplace; 
}

不足之处,敬请谅解,欢迎交流。

对于题目与解法的来源,本人尽量给出出处,尊重原创,方便大家寻找。

posted @ 2017-03-21 20:25  在一起的风景  阅读(184)  评论(0编辑  收藏  举报