題目來源:http://www.PRogramfan.com/acm/show.asp?qid=81Problem:設有字符串X,我們稱在X的頭尾及中間插入任意多個空格后構成的新字符串為X的擴展串,如字符串X為“abcbcd”,則字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的擴展串,這里“□”代表空格字符。 如果A1是字符串A的擴展串,B1是字符串B的擴展串,A1與B1具有相同的長度,那么我們定義字符串A1與B1的距離為相應位置上的字符的距離總和,而兩個非空格字符的距離定義為它們的ASCII碼的差的絕對值,而空格字符與其它任意字符之間的距離為已知的定值K,空格字符與空格字符的距離為0。在字符串A、B的所有擴展串中,必定存在兩個等長的擴展串A1、B1,使得A1與B1之間的距離達到最小,我們將這一距離定義為字符串A、B的距離。 請你寫一個程序,求出字符串A、B的距離。
Input有多組數據,每一組數據第一行為字符串A,第二行為字符串B,A、B均由小寫字母組成且長度均不超過2000,第三行為一個整數K,1≤K≤100,表示空格與其它字符的距離。
Output每組數據一行包含一個整數,表示要求的字符串A、B的距離。
Sample Inputcmcsnmn2Sample Output10
在學習了評論人wanshude_bhr的代碼后,發現其代碼存在一定的問題,對于下列這種情況:字符串A為:ax字符串B為:cbzyK值為:3
程序給出的答案為10,但實際結果為8。因此對于字符串A中i位(從0開始)元素,將其與B中所有元素比較,找出B中滿足Math.abs(a.charAt[i] - b.charAt[j]) < k的元素,并記錄最小的絕對值及其對應的下標j。修改后的程序能夠計算出上述情況的正確答案,但當A、B調換位置或者出現字符串A為azy字符串B為cbx時,程序無法正常運行。代碼如下:
package test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class DistanceOfStrings{ // first step:去除兩個字符串中相同的字母 // second step:去除字符串中距離小于k值的字母 public String deleteChar(String s, int n) { int l = s.length(); return s.substring(0, n) + s.substring(n + 1, l); }}public static void main(String[] args){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Please entry two strings and the value k:"); String a = ""; String b = ""; int k = 0; int sum = 0; int min = 0; int p = 0; boolean flag = false; try { a = br.readLine().trim(); b = br.readLine().trim(); } catch (IOException e) { e.printStackTrace(); } try { k = Integer.parseInt(br.readLine()); } catch (NumberFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DistanceOfStrings dos = new DistanceofStrings(); // first step: for (int i = 0; i < a.length(); i++) { for (int j = 0; j < b.length(); j++) { if (a.charAt(i) == b.charAt(j)) { a = dos.deleteChar(a, i); b = dos.deleteChar(b, j); i --; j --; break; } } } // second step: for (int i = 0; i < a.length(); i++) { min = k; for (int j = 0; j < b.length(); j++) { if (Math.abs(a.charAt(i) - b.charAt(j)) < min) { flag = true; min = Math.abs(a.charAt(i) - b.charAt(j)); p = j; } } if (flag == true) { sum += min; a = dos.deleteChar(a, p); b = dos.deleteChar(b, p); i --; } } sum += (a.length() + b.length()) * k; System.out.println(sum);}
新聞熱點
疑難解答