日期:2014-05-20  浏览次数:20603 次

字符串回文数算法有没有通用公式
刚才在这边看到一提,如图:


能够写出一些代码,但是还缺少最后一步,请赐教:

/**
 * 计算s指定的字符串能够组成的回文字符串的个数
 * 
 * @param s
 *            全小写字母,且长度小于100的源字符串
 * @return count 能够组成的回文字符串个数
 */
public static int palindrome(String s) throws Exception {
int count = 0;
// 字符串不能为空
if (s == null) {
throw new Exception("字符串不能为空");
}

// 将s装换为字符数组
char[] sToArray = s.toCharArray();

// 将sToArray数组排序
Arrays.sort(sToArray);

// 将排序后的字符数组转换为字符串
String strConvert = sToArray.toString();

int onlyNumber = 0;// 单个出现的字符个数
int baseNumber = 0;// 不成对出现的相同字符的个数
int doubleNumber = 0;// 成对出现的相同字符的个数
int nowPosition = 0;// 当前下标位置
int oldPosition = nowPosition;// 上次读取的位置
// 遍历不重复出现的字符并记录相同字符个数和单个字符个数
while (nowPosition != strConvert.length()) {
// 找到与上次位置指定字符重复的最后下标
nowPosition = strConvert.lastIndexOf(oldPosition);

// 如果上次读取的位置不等于当前读取的位置,相同字符个数加1
// 当前操作位置累加1,上次操作的位置等于累加后的操作位置
if (oldPosition != nowPosition) {
// 相同字符的长度,用于判断是否在回文字符串的中间位置
if ((nowPosition - oldPosition) % 2 == 0) {
// 等于0,说明该长度是基数,则只能出现在中间位置
baseNumber++;
} else {
// 不等于0,说明是偶数长度,可以出现在以length/2 或 length/2+1的位置
doubleNumber++;
}

// 当前操作位置等于上次操作位置,当前字符为单个字符,只能出现在中间位置
} else {
onlyNumber++;
}

// 单个出现的字符超过两个时,该字符串不能构成回文字符串,方法结束
if (onlyNumber == 2) {
return count;
}

// 当前位置下移
nowPosition++;

// 记录偏移后的位置
oldPosition = nowPosition;
}

//计算回文数
/*这里不知道怎么实现*/

return count;
}

------解决方案--------------------