水仙花数(回溯算法)
给定非空字符串s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
1、若分割不成功,则返回0;
2、若分割成功且分割结果不唯一,则返回-1;
3、若分割成功且分割结果唯一,则返回分割后子串的数目。
输入描述
输入字符串的最大长度为200
输出描述
根据题目描述中情况,返回相应的结果。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abc
输出
0
说明
分割不成功
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
f3@d5a8
输出
-1
说明
分割成功但分割结果不唯一,可以分割为两组,一组”f3″和”@d5a8″,另外一组”f3@d5″和”a8″。
a:97,8:56,两者相加为153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
示例3 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
AXdddF
输出
2
说明
成功分割且分割结果唯一,可以分割为”AX”(153)和”dddF”(370)两个子串。
A:65
X:64+26-2=88
65+88=153
d:97+3=100
dddF = 100 * 3 + 70 = 370 = 33+73 = 27 + 343 = 370
题目分析
在我们遇到排列、组合(子集、幂集、字符全排列)等题目时,要想到利用回溯算法看能不能解决问题。
什么是回溯算法
回溯法的基本原理就是递归,回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法
回溯算法模板
result = [] //结果一定是要有一个全局参数来保存
def backtrack(路径, 选择列表):
if 满足结束条件: //出口条件
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表) //递归
撤销选择
Java解法
import java.util.*;
public class Main {
static ArrayList<String> subStrings = new ArrayList<>();//一次遍历可行解,用于暂时存储与回溯
static ArrayList<ArrayList<String>> subStringsList = new ArrayList<ArrayList<String>>();//所有可行解
public static void main(String[] args)