给定一个字符串str,和一个字母ch,请实现相应的代码求出一个数组,使数组中每个数字表示该位置与字母ch之间的最短距离。
比如str=”lexinfintech” ch=”i”
则输出为:[3,2,1,0,1,1,0,1,2,3,4,5]
输入描述:
第一行为字符串
第二行为字母
输出描述:
一个数字数组
示例1
输入
lexinfintech
i
输出
[3,2,1,0,1,1,0,1,2,3,4,5]
解析:JAVA实现
package com.lncywlc.rio;
import java.util.Scanner;
/**
* =============================================
*
* @author: wuliangchao
* @desc :
* @create: 2018-12-22 22:43
* @lncywlc: 几度东风吹世换,千年往事随潮去。
* =============================================
*/
public class Test {
public static void main(String[]args) {
Scanner str1 = new Scanner(System.in);
String str = str1.nextLine();
Scanner cha = new Scanner(System.in);
String ch = cha.next();
char c = ch.charAt(0);
//以字符ch为分隔符,将字符串分割为若干字符数组
String[] ss = str.split(ch);
char s = str.charAt(str.length()-1);
int i = 0;
int j = 0;
int k = 0;
//存放距离的数组
int [] a = new int[str.length()];
//如果字符串的最后一个字符和输入的字符相同,则做记号特殊考虑
boolean flag=false;
if(s==c){
flag = true;
}
//遍历每一个字符数组,分别计算距离
for (i = 0 ; i< ss.length;i++){
if(i==0){
//分割的第一个字符数组
for ( k=ss[i].length();k>0;k--){
a[j++] = k;
}
}else if (i==ss.length-1 && flag != true){
//分割的最后一个数组 并且字符串最后一个元素不等于分割字符
for ( k= 0;k<ss[i].length();k++){
a[j++] = k+1;
}
}else {
//中间的字符串
//m和n判断当前字符数组的字符个数是奇偶
int n = ss[i].length()/2;
int m = ss[i].length()%2;
//当前字符数组前半部分距离
for( k = 0;k<n;k++){
a[j++]=k+1;
}
//奇数则中间值特殊考虑
if (m==1){
a[j++]=n+1;
}
//当前字符数组后半部分距离
for( k = n;k>0;k--){
a[j++]=k;
}
}
//字符串中每个与分割字符相同的字符位置置为0
if (i!=ss.length-1||flag){
a[j++]=0;
}
}
//最终结果遍历输出
int ii = 0;
System.out.print("[");
for (ii = 0;ii < a.length-1; ii++){
System.out.print(a[ii]+",");
}
System.out.print(a[ii]+"]");
}
}