1. 程式人生 > 實用技巧 >字串類題

字串類題

第一題:統計出現次數最多和最少次數,並判斷差是否是質數

題目:題目描述
笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!

這種方法的具體描述如下:假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn-minn是一個質數,那麼笨小猴就認為這是個Lucky Word,這樣的單詞很可能就是正確的答案。

輸入格式
一個單詞,其中只可能出現小寫字母,並且長度小於100100。

輸出格式
共兩行,第一行是一個字串,假設輸入的的單詞是Lucky Word,那麼輸出“Lucky Word”,否則輸出“No Answer”;

第二行是一個整數,如果輸入單詞是Lucky Word,輸出maxn-minn的值,否則輸出00。

輸入輸出樣例
輸入 #1複製
error
輸出 #1複製
Lucky Word
2
輸入 #2複製
olympic
輸出 #2複製
No Answer
0
說明/提示
【輸入輸出樣例1解釋】

單詞error中出現最多的字母rr出現了33次,出現次數最少的字母出現了11次,3-1=23−1=2,22是質數。

【輸入輸出樣例2解釋】

單詞olympic中出現最多的字母ii出現了11次,出現次數最少的字母出現了11次,1-1=01−1=0,00不是質數。

(本處原題面錯誤已經修正)

noip2008提高第一題

/**
 * 
 * @author yyyy
 *第一步:統計每個字母出現的次數
 *第二:更新最大值和最小值
 *第三:判斷是否是質數
 */
import java.util.Scanner;
public class Main{
	public static boolean sushu(int ans)
	{
		if(ans==1||ans==0)
			return false;
		
		for(int i=2;i<Math.sqrt(ans);i++)
		{
			if(ans%i==0)
				return false;
		}
		
		return true;
		
	}
	public static void main(String[] args)
	{
		
		int max=0;int min=99999999;
		Scanner in=new Scanner (System.in);
		String a=in.nextLine();
		char[] s=a.toCharArray();
		int ans[]=new int[105];
		for(int i=0;i<s.length;i++)//統計出現的次數
		{
			ans[s[i]-'a']++;
		}
		for(int i=0;i<26;i++)//更新最大值和最小值
		{
			if(ans[i]>max)max=ans[i];
			if(ans[i]>0&&ans[i]<min)min=ans[i];
		}
		int bb=max-min;
		if(sushu(bb)) {
			System.out.println("Lucky Word");
			System.out.println(bb);
		}
		else {
			System.out.println("No Answer");
			System.out.println("0");
		}
	}
}

第二題:統計目標單詞出現次數和第一次出現的位置

題目:
題目描述
一般的文字編輯器都有查詢單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。

現在,請你程式設計實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。

輸入格式
共22行。

第11行為一個字串,其中只含字母,表示給定單詞;

第22行為一個字串,其中只可能包含字母和空格,表示給定的文章。

輸出格式
一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從00 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1−1。

輸入輸出樣例
輸入 #1複製
To
to be or not to be is a question
輸出 #1複製
2 0

輸入 #2複製
to
Did the Ottoman Empire lose its power at that time
輸出 #2複製
-1
說明/提示
資料範圍

1≤1≤單詞長度≤10≤10。

1≤1≤文章長度≤1,000,000≤1,000,000。

noip2011普及組第2題

分析:
1.題目中沒有說明大小寫有區別,所以將所有內容轉換為小寫字母,或者大寫字母都行
2.因為有空格,題目中沒有要求空格也算在字元裡,所以需要去掉空格,以空格來分割字串(split(" "))
3.遍歷,尋找是否有與目標相同的單詞存在
4.在尋找第一次出現的位置這一部分程式碼中,需要注意的是,是否是在文章的的第一個單詞出現,保證單詞都是單獨出現的,所以該字串前後要拼接空格後再去匹配,返回的位置加1就是首次出現的位置.
import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main{
	static int count,first;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner (System.in);
		String key=in.next().toLowerCase();//目標單詞
		in.nextLine();//將字元緩衝區的資料用掉,就不會影響到下一次的輸入
		String s=in.nextLine().toLowerCase();//文章
	    String [] ss=s.split(" ");//將文章以空格切開,單詞存入陣列中
	    
	   
	    for(int i=0;i<ss.length;i++)
	    {
	    	if(key.equals(ss[i]))
	    		count++;
	    }
	    
	    if(count==0)
	    	System.out.println(-1);
	    else {
	    	if(key.equals(s.substring(0,key.length()))) {
	    		first=0;
	    	}
	    	else {
	    		first=s.indexOf(" "+key+" ")+1;
	    	}
	    	System.out.println(count+" "+first);
	    }
	    in.close();
	}

}