判断一个字符串是否包含另一个字符串(用java但是不能用index()这个函数)

来源:互联网 发布:海兴电力嵌入式软件 编辑:程序博客网 时间:2024/06/08 11:44
目录: 
一.方法介绍 
二.图示意 
三.源代码 

一.方法介绍 

判断一个字符串str1是否包含另一个字符串str2: 
1.取str2的第一个字符一次和str1的字符依次比较,知道找到相等的字符为止或者找完整个str1的length. 

2.当找到相等的字符后,在str2长度内str2与str1依次进行比较 

二.图示意

 

三.源代码 

JDK中java.lang.String.indexOf(char[], int, int, char[], int, int, int)源码: 

/**     * Code shared by String and StringBuffer to do searches. The     * source is the character array being searched, and the target     * is the string being searched for.     *     * @param   source       the characters being searched.     * @param   sourceOffset offset of the source string.     * @param   sourceCount  count of the source string.     * @param   target       the characters being searched for.     * @param   targetOffset offset of the target string.     * @param   targetCount  count of the target string.     * @param   fromIndex    the index to begin searching from.     */    static int indexOf(char[] source, int sourceOffset, int sourceCount,                       char[] target, int targetOffset, int targetCount,                       int fromIndex) {if (fromIndex >= sourceCount) {            return (targetCount == 0 ? sourceCount : -1);}    if (fromIndex < 0) {        fromIndex = 0;    }if (targetCount == 0) {    return fromIndex;}        char first  = target[targetOffset];        int max = sourceOffset + (sourceCount - targetCount);        for (int i = sourceOffset + fromIndex; i <= max; i++) {            /* Look for first character. */            if (source[i] != first) {                while (++i <= max && source[i] != first);            }            /* Found first character, now look at the rest of v2 */            if (i <= max) {                int j = i + 1;                int end = j + targetCount - 1;                for (int k = targetOffset + 1; j < end && source[j] ==                         target[k]; j++, k++);                if (j == end) {                    /* Found whole string. */                    return i - sourceOffset;                }            }        }        return -1;    }

模仿的判断一个字符串是否包含另一个字符串的源码: 

public static String compareDoubleString(String source, String target) {// 分别获取两个字符串的长度,因为后面会用到int sourceLength = source.length();int targetLength = target.length();// 获取目标的第一个字符char firstTargetChar = target.charAt(0);// 最多比较的次数int max = sourceLength - targetLength;// 如果第一个不相等,那么一直找到相等的那一个或者找完都不能找到int sourceOffset = -1;while (++sourceOffset < max&& source.charAt(sourceOffset) != firstTargetChar) {}if (sourceOffset <= max) {// 设置新的源索引int newSourceOffset = sourceOffset + 1;// 剩余的比较长度,也就是在offset上增加targetLengthint leaveLength = newSourceOffset + targetLength - 1;int targetOffset = 1;// 连续的比较,条件不符合的时候跳出for (; newSourceOffset < leaveLength&& source.charAt(newSourceOffset) == target.charAt(targetOffset); newSourceOffset++, targetOffset++);if (newSourceOffset == leaveLength) {return "包含:source包含target字符串!";}}return "不包含:source不包含target字符串!";}

总结:面对这样的算法,我们第一反应是要先找到子串为一样的时候,才返回包含,其它条件都是不包含,然后就是先找源字符串里面第一个和子字符串里面的第一个相等,如果找不到就直接结束,既不包含,如果有的话,再找依次增加判断,如果最后指针移动了子串的长度,就说明包含,要记得最后
newSourceOffset
++了一次,所以可以和leaveLength相等。

0 0
原创粉丝点击