水仙花数Ⅱ 有的标题也叫 字符串分割
题目描述
给定非空字符串s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数
1、若分割不成功,则返回0;
2、若分割成功且分割结果不唯一,则返回-1;
3、若分割成功且分割结果唯一,则返回分割后子串的数目
输入描述
输入字符串的最大长度为200
输出描述
根据题目描述中情况,返回相应的结果。
示例1
输入
abc
输出
0
说明
分割不成功
示例2
输入
f3@d5a8
输出
-1
说明
分割成功但分割结果不唯一,可以分割为两组,一组'f3'和'@d5a8',另外一组'f3@d5'和'a8'
示例3
输入
AXdddF
输出
2
说明
分割成功且分割结果唯一,可以分割成'AX'和'dddF'(370)两个子串
备注
“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如371是'水仙花数',因371=3^3+7^3+1^3
java代码
package odTest;
import java.util.Scanner;
public class NarciNum {
static int count;
static String situation;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] charList = scanner.nextLine().toCharArray();
// boolean[] hasUse = new boolean[charList.length];
count = 0;
situation = "";
splitString(charList,0);
if(count == 1) {
String[] judge = situation.split(" ");
char[] splitLen = judge[0].toCharArray();
int len = 0;
for(int i = 0;i<splitLen.length;i++) {
len = len+Integer.parseInt(splitLen[i]+"");
}
if(len == charList.length && splitLen.length>1) {
System.out.println(splitLen.length);
}
}else if(count > 1) {
System.out.println(-1);
}else {
System.out.println(0);
}
}
private static void splitString(char[] charList,int index) {
if(index == charList.length) {
count = count+1;
situation = situation+" ";
return;
}
int sum = 0;
int flag =0;
for(int i=index;i<charList.length;i++) {
sum =sum+(int)charList[i];
flag++;
if(judgeNarciNum(sum)) {
situation = situation+flag;
splitString(charList,i+1);
}
}
}
//判断算法为水仙花数
public static boolean judgeNarciNum(int num){
int sum = 0;
int contrast = num;
while(num%10!=0||num/10!= 0) {
int i = num%10;
num=num/10;
sum = sum+i*i*i;
}
if(contrast == sum) {
return true;
}else {
return false;
}
}
}