1. 程式人生 > 其它 >藍橋杯—不同字串(C語言解法)

藍橋杯—不同字串(C語言解法)

題目描述

一個字串的非空子串是指字串中長度至少為 1 的連續的一段字元組成的串。
例如,字串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 個。
注意在計算時,只算本質不同的串的個數。
請問,字串0100110001010001 有多少個不同的非空子串?

答案提交

這是一道結果填空的題,你只需要算出結果後提交即可。
本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

思路

  1. 因為C語言中處理字串太麻煩了,所以可以將輸入轉化為整數,然後存入陣列,判重也更容易了

程式碼

#include<stdio.h>
int res;
int main(){
	int i,len,flag,sum=0;
	char s[20];
	int num1[20];
	long long int num2[200];
	for(i=0;;i++){
		scanf("%c",&s[i]);
		if(s[i]=='\n')break;
		//num1[i]=s[i]-96;//示例,轉化為整數
		if(s[i]=='0')num1[i]=9;//0 1轉換為數字,任意都可
		else num1[i]=8;
	}
	len=i;
	for(i=0;i<len;i++){
		sum=0;//記錄從i開始到j結束的和,方便判重
		for(int j=i;j<len;j++){//遍歷輸入的資料陣列,i表示開始,j表示結束
			flag=1;
			sum=sum*10+num1[j];//直接加會漏掉,aa 和 b 都是2會漏
			for(int k=0;k<res;k++){//儲存結果的陣列
				if(sum==num2[k]){
					flag=0;
					break;
				}
			}if(flag){num2[res++]=sum;}
		}	
	}
	printf("%d",res);
	return 0;
}