给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

//主函数:
#include "kk.h"

int main()
{ 
    ap num;
	printf("请你输入一连串字符:\n");
	scanf("%s",num.st);
    bzero(num.location,sizeof(num.location));//清空位置标记位
    bzero(num.st2,sizeof(num.st2));  //清空窗口串标志位
    num.move=0;  //窗口移动标量
	printf("\n");
	printf("请你输入子串\n");
	scanf("%s",num.st1);

    sort(num.st1);//对子串排序
    printf("%s\n",num.st1); //检查子串是否排序



     search(&num);
    myprintf(&num);
    /* sequence(&num,strlen(num.st1));
    printf("%s\n",num.st2); */
   /*  for(int i=0;i<strlen(num.st);i++)
    {
        sequence(&num,strlen(num.st1));
        num.ly++;
        if(!strcmp(num.st1,num.st2))
        {
            printf("你好\n");
        }

    } */
  
}

//头文件
#ifndef _KK_H
#define _KK_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef int uint_32;

typedef struct 
{
    char st[100];//主串
    char st1[100]; //子窜
    char st2[100]; //窗串
    int location[100];   
    int move;
}ap;


void search(ap *num);  //查找
void myprintf(ap *num);  //打印
void sequence(ap *num,int n); //窗口获取
void sort(char *num);  //冒泡排序
#endif
//函数.c文件

#include "kk.h"


void search(ap *num)     //查找记录函数
{
	//printf("%s\n",num->st);
	//printf("%s\n",num->st1);
	//printf("%ld\n",strlen(num->st1));
	char *p=num->st;
	uint_32 u=0;      
	while(*p!='\0')              // abcdaadsfsf
	{        					 //  bc
		sequence(num,strlen(num->st1));
		
		num->move++;

		if(strcmp(num->st1,num->st2)==0)
	   {   
		    printf("你输入%s\n",num->st2);
			printf("你输入%d\n",num->move);
			num->location[u]=num->move-1;
			num->location[u+1]=num->move+strlen(num->st1)-2;
            u+=2;
	   }

        p++;
	}	
}


void myprintf(ap *num)//打印函数
{
	uint_32 start=0;
	uint_32 end=0;
	uint_32 length=0;
	for(int i=0;i<100;i++)
	{
		if(num->location[i]!=0)
		{
			length++;
		}
	}
	printf("%d的lwngth:\n",length++);
	printf("%s的异位词子串:\n",num->st);
	for(int j=0;j<length;j++)
	{
		start=num->location[j];
		end=num->location[++j];
		printf("%d--%d:",start,end);
		for(start;start<=end;start++)
		{
			printf("%c",num->st[start]);
		}

		printf("\n");

		
	}

}

void sequence(ap *num,int n)
{
	
	bzero(num->st2,sizeof(num->st2));
	if((num->move+strlen(num->st1))!=strlen(num->st)+1)
	{
	strncpy(num->st2,num->st+num->move,n);
	sort(num->st2);
	}
}


void sort(char *num)
{
	char swap='0';
	for(int j=0;j<strlen(num);j++)
	{
    for(int i=0;i<strlen(num)-j-1;i++)
	{
		if(num[i]>num[i+1])
		{
			swap=num[i];
			num[i]=num[i+1];
			num[i+1]=swap;
		}
	}


	}
	

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值