匹配圆周率题 求助大神
求助大神! 研究到哭也是错误,网上搜不到~ #include <stdio.h>
int match(char s1[] , char s2[])
{
int i , j , m , n , r = -1 ;
for(m = 0 ; s1 ; m ++) ;
for(n = 0 ; s2 ; n ++) ;
if(m >= n && n > 0) {
for(i = 0 ; i < m - n + 1 ; i ++) {
for(j = 0 ; j < n ; j ++) if(s1 != s2) break ;
if(j == n) {
r = i ;
break ;
}
}
}
return r ;
}
int main(void)
{
char s1 , s2;
scanf("%s" , s1) ;
scanf("%s" , s2) ;
printf("%d\n" , match(s1 , s2)) ;
}
编译、运行实况:
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
1234
1234
0
D:\00.Excise\C>x
1234
12345
-1
D:\00.Excise\C>x
821999052039574422
19990520
2
D:\00.Excise\C>x
881994082555083527588321827035
19940825
2
D:\00.Excise\C> #include <stdio.h>
int match(char A[], char B[]){
for(int i = 0; A; i++){
if(A == B){
int check = 1;
for(int j = i, n = 0; B; j++, n++){
if(B != A){
check = -1;
break;
}
if(check) return i;
}
}
}
return -1;
}
int main(){
char A, B;
scanf("%s", A);
scanf("%s", B);
int answer = sizeof(A) >= sizeof(B) ? match(A, B) : -1;
printf("%d", answer);
} {:10_254:} jackz007 发表于 2021-11-13 22:45
编译、运行实况:
最后的测试点显示超时,可能有些问题 傻眼貓咪 发表于 2021-11-14 09:35
部分正确,有2个测试点不正确 寂寞知己 发表于 2021-11-14 20:06
部分正确,有2个测试点不正确
已修改:#include <stdio.h>
int match(char A[], char B[], int N, int M){
for(int i = 0; i < N-M+1; i++){
if(A == B){
int check = 1;
for(int j = i, n = 0; B; j++, n++){
if(B != A){
check = -1;
break;
}
if(check) return i;
}
}
}
return -1;
}
int main(){
char A, B;
scanf("%s", A);
scanf("%s", B);
int a, b;
for(a = 0; A; a++){}
for(b = 0; B; b++){}
int answer = a > b ? match(A, B, a, b) : -1;
printf("%d", answer);
} {:10_254:} 傻眼貓咪 发表于 2021-11-14 20:57
已修改:
还是3个错误点。。。。。。 寂寞知己 发表于 2021-11-15 21:08
还是3个错误点。。。。。。
抱歉,有没有可以参考的参数?{:5_99:} {:10_254:} 傻眼貓咪 发表于 2021-11-15 21:13
抱歉,有没有可以参考的参数?
只有这个。。。。。
第一个人是对的 只不过最后那个测试点显示超时,你这个借鉴下第一个人 把超时整没有了 应该就是正确答案啦 {:10_254:} jackz007 发表于 2021-11-13 22:45
编译、运行实况:
这个超时能解决一下吗?
本帖最后由 jackz007 于 2021-11-15 22:51 编辑
寂寞知己 发表于 2021-11-15 22:17
这个超时能解决一下吗?
那就再试试这个?
#include <stdio.h>
int main(void)
{
char s1 , s2 ;
int i , j , k = -1 , m , n ;
scanf("%s" , s1) ;
scanf("%s" , s2) ;
for(m = 0 ; s1 ; m ++) ;
for(n = 0 ; s2 ; n ++) ;
if(m >= n && n > 0) {
for(i = 0 ; i < m - n + 1 ; i ++) {
for(j = 0 ; j < n ; j ++) if(s1 != s2) break ;
if(j == n) {
k = i ;
break ;
}
}
}
printf("%d\n" , k) ;
} jackz007 发表于 2021-11-15 22:49
那就再试试这个?
还是超时。。。。。。。。。。。。。。 本帖最后由 jackz007 于 2021-11-15 23:01 编辑
寂寞知己 发表于 2021-11-15 22:51
还是超时。。。。。。。。。。。。。。
这个呢?
#include <stdio.h>
int main(void)
{
char c , s1 , s2 ;
int i , j , k = -1 , m , n ;
for(m = 0 ; (c = getchar()) != '\n' ; m ++) s1 = c ;
for(n = 0 ; (c = getchar()) != '\n' ; n ++) s2 = c ;
if(m >= n && n > 0) {
for(i = 0 ; i < m - n + 1 ; i ++) {
for(j = 0 ; j < n ; j ++) if(s1 != s2) break ;
if(j == n) {
k = i ;
break ;
}
}
}
printf("%d\n" , k) ;
} jackz007 发表于 2021-11-15 22:59
这个呢?
还是超时。。。。。。。。 最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。 寂寞知己 发表于 2021-11-15 23:02
还是超时。。。。。。。。 最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。
这已经是我的极限了,希望不会错:#include <stdio.h>
int kmp(char S[], char W[], int s, int w){
int P, nP = 0, j = 0, k = 0, T;
for(int i = 0; i < s; i++){
T = -1;
P = -1;
}
while(j < s){
if(W == S){
j++;
k++;
if(k == w){
P = j-k;
nP++;
k = T;
}
}
else{
k = T;
if(k < 0){
j++;
k++;
}
}
}
for(int i = 0;; i++){
if(P > 0){
return P;
}
}
}
int main()
{
char A, B;
scanf("%s", A);
scanf("%s", B);
int a, b;
for(a = 0; A; a++){}
for(b = 0; B; b++){}
int answer = a > b ? kmp(A, B, a, b) : -1;
printf("%d", answer);
} 寂寞知己 发表于 2021-11-15 23:02
还是超时。。。。。。。。 最后那个检测点超时 ,应该还是算法出了问题,有某处跟题不符合吧。。
题目要求使用 KMP 快速模式匹配,我在网上抄了一段代码,现在再试试呢
#include <stdio.h>
void Next(char * T , int * next)
{
int i = 1 , j = 0 , m ;
next = 0 ;
for(m = 0 ; T ; m ++) ;
while(i < m) {
if(j == 0 || T == T) {
i ++ ;
j ++ ;
next = j ;
} else {
j = next ;
}
}
}
int KMP(char * S , char * T)
{
int i = 1 , j = 1 , next , m , n ;
for(m = 0 ; S ; m ++) ;
for(n = 0 ; T ; n ++) ;
Next(T , next) ;
while(i <= m && j <= n) {
if (j == 0 || S == T){
i ++ ;
j ++ ;
} else {
j = next ;
}
}
if(j > n) return i - n - 1 ;
else return -1 ;
}
int main(void)
{
char c , s1 , s2 ;
int m , n ;
for(m = 0 ; (c = getchar()) != '\n'; m ++) s1 = c ;
for(n = 0 ; (c = getchar()) != '\n'; n ++) s2 = c ;
s1 = s2 = '\0' ;
printf("%d\n" , KMP(s1, s2)) ;
}