输入两个字符串str1和str2,输出str2在str1中的所有位置,没有则输出no

样例输入: abcabcabc ab 样例输出: 0 3 6

#include <string.h>
int main() {
	char ch1[101] = { 0 };
	char ch2[31] = { 0 };
	int n, m, i, j;
	scanf_s("%s", ch1,100);
	scanf_s("%s", ch2,30);
	n = strlen(ch1);
	m = strlen(ch2);

	int pos[100] = { -1 };
	int npos = -1;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (ch1[i + j] != ch2[j])
				break;
		}
		if (j == m)
		{
			npos++;
			pos[npos] = i;
		}
	}
	if (npos == -1)
		printf("NO");
	else
		for (i = 0; i<=npos; i++)
			printf("%d ", pos[i]);


	return 0;
}

 

这道题最简单的方法就是嵌套循环暴力解题,稍微复杂一点就是用 kmp 算法。如果只是课堂循环啥的,用嵌套循环暴力解题就好了。如果是做算法题的话,就需要用 kmp 算法。

package net.dc.lesson20.exercise;

public class GetStrPosition {
    public static void main(String[] args) {
        String str = "I love Java I love Python I love Internet";
        //第一种方法
        int frontLength = 0;//定义该变量用于记录匹配"love"的元素前面的长度
        while(str.contains("love")){//只要该str字符串中有匹配"love"的元素,才进行以下操作
            int index = str.indexOf("love");//定义该变量用于记录匹配"love"的元素在当前字符串的位置
            //匹配"love"的元素位置等于frontLength加上index;加1为了从1开始计数,更加直观:
            System.out.println(String.format("str[%d] = love", index + frontLength + 1));
            frontLength += (index + 4);
            str = str.substring(index + 4);//将字符串中匹配"love"元素的前面部分及其本身截取,留下后面的部分
        }
        System.out.println();

        //第二种方法
        String str_2 = "I love Java I love Python I love Internet";
        String[] strArr = str_2.split(" ");
        for (int i = 0; i < strArr.length; i++) {
            if(strArr[i].equals("love")){
                int frontLength_2 = 0;//定义该变量用于记录匹配"love"的元素前面的长度
                for(int j = 0; j < i; j++){
                    frontLength_2 += strArr[j].length();
                }//该循环是为了加上前面数组元素的长度
                frontLength_2 += i;//加上前面空格的个数
                //加1是因为,在数组中匹配该"love"元素的位置,并不仅仅只是前面所有元素的长度加上空格个数,还得算上该元素本身出现的位置
                System.out.println(String.format("str[%d] = love", frontLength_2 + 1));
            }
        }
    }
}


 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632