题目
单词缩写,举个例子:
International Collegiate Programming Contest
改写为ICPC (International Collegiate Programming Contest)。
答案
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String getStr = shortStr(str);
System.out.println(getStr);
}
private static String shortStr(String str) {
//全局变量
StringBuilder builder = new StringBuilder(str);
int first=0;
int next=sentence(builder,first);
//执行
while (next!=0){
next=sentence(builder,next);
}
//返回
return builder.toString();
}
/**
* 将arrList数组转换为字符串
* @param arr
* @return
*/
private static String arrToString(ArrayList<Character> arr) {
String str = "";
for (int i = 0; i < arr.size(); i++) {
str += arr.get(i);
}
return str;
}
/**
* 将stringbuilder中的第i个单词找到该单词末尾j
*/
private static int getCharTail(StringBuilder builder,int i){
if (!Character.isLetter(builder.charAt(i))){
// System.out.println("不是一个字符:"+i+builder.charAt(i-2)+builder.charAt(i-1));
return 0;
}
while (Character.isLetter(builder.charAt(i))){
i++;
if (i==builder.length()){
break;
}
}
int j=i-1;
return j;
}
/**
* 得到stringbuilder中第i个单词的下一个单词首部j
* 如果是非空格,表示没有下一个单词,返回-1
*/
private static int getNextChar(StringBuilder builder,int i){
int j=getCharTail(builder,i)+1;
if (!Character.isSpaceChar(builder.charAt(j))){
return -1;
}
return j+1;
}
/**
* 判断该单词是否是最后一个单词,首字母位置i表示这个单词
* 如果是该句最后一个单词下一句单词的位置j
* 如果是全文最后一个单词返回0
* 不是返回最后一个单词-1
*/
private static int isLastChar(StringBuilder builder,int i){
if (getNextChar(builder,i)!=-1){
return -1;
}
int j=getCharTail(builder,i)+2;
while (j<builder.length()){
if (Character.isLetter(builder.charAt(j))){
return j;
}
j++;
}
return 0;
}
/**
* 压缩一句句子,i表示该句第一个单词首字母位置,返回压缩后的句子的下一句首单词,如果没有下一句返回i
*/
private static int sentence(StringBuilder builder,int i){
int j=0;
if (Character.isUpperCase(builder.charAt(i))){
j =shorting(builder,i);
}else {
j =getNextChar(builder, i);
if (j==-1){
return isLastChar(builder,i);
}
// System.out.println(j);
}
return j;
}
/**
*当首字母是大写打时候压缩这个句子,返回压缩完后的下一个字母
*/
private static int shorting(StringBuilder builder,int i){
int next=0;
ArrayList<Character> arr=new ArrayList<Character>();
arr.add(builder.charAt(i));
int jj=getCharTail(builder,i);
int j=getNextChar(builder, i);
if (j==-1){
return isLastChar(builder,i);
}
while (Character.isUpperCase(builder.charAt(j))){
arr.add(builder.charAt(j));
jj=getCharTail(builder,j);
j=getNextChar(builder, j);
if (j==-1){
next= isLastChar(builder,jj);
break;
}
}
if (arr.size()>1){
String okk=builder.substring(i,jj+1);
builder.replace(i,jj+1,arrToString(arr)+" ("+okk+")");
// System.out.println(okk);
}
int hhh=getNextChar(builder,jj);
if (hhh==-1){
return next;
}
return hhh;
}
}