真子串是指从原字符串中通过删除某些字符但不破坏余下字符的顺序而形成的新字符串。
输入n个字符串,统计出现某个字符串是另一个字符串的真子串的组数。
输入
输入n及n个字符串
输出
真子串数目
样例输入
3
abc
cxajfkabjfkdc
xjfabkdc
样例输出
3
两两握手的规模.
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
// // 拷贝到平台的时候把my_fuction_lib.h注释掉.
//#include "my_fuction_lib.h"
//在此下方插入自定义函数对的声明:
int is_sub_string(char*a,char*b)
{
int len_a = strlen(a);
int len_b = strlen(b);
char *longer = b;
char *shorter = a;
int len_longer = len_b , len_shorter = len_a;
if(len_a>len_b)
{
longer = a;
shorter = b;
len_longer = len_a;
len_shorter = len_b;
}
int is_match = 0;
int j = 0;
/* 不回头的遍历 */
for(int i = 0; i<len_shorter;i++)
{
for(;j < len_longer;j++)
{
if(shorter[i] == longer[j])
{
is_match ++;
break;
}
}
if (shorter[i] == longer[j])
{
j++;
}
if (is_match == len_shorter)
{
return 1;
}
}
return 0;
}
//主函数main
int main()
{
//复制模版式删除这个或者再下面一个
int n;
while( scanf("%d",&n) != EOF)
{
int sum = 0;
int k = 50;
char* p = (char*)malloc(sizeof(char)*k*k);
char* q = p;//拷贝初始地址以备用.
for(int i = 0;i<n;i++)
{
scanf("%s",p);
p += k;
}
p = q;//将指针回拨到初始位置(之前由于读入数据导致偏移.
for(int i = 0;i<n;i++)
{
for(int j = i + 1;j < n;j++)
{
sum += is_sub_string((p+k*i),(p+k*j));
}
}
printf("%d\n",sum);
}
return 0;
}