题目: 只包含重复字母的单词称为dupledrome,比如“llaammaa”,”ssaabb”。编写一个名为isDupledrome的方法,检测一个单词是否只是由重复的字母组成。
java代码:
package dupledrome;
public class dupledrome {
public static void main(String[] args) {
String s = "abcdefgabcdefg";
System.out.println(isDuplerome(s));
}
public static boolean isDuplerome(String s) {
int n = s.length();
int flag = 0;
int flagj = 0; //判断后面有没有出现重复字符
int m = 0;
for (int i=0;i<n;i++) {
//System.err.println("i="+i);
flag = 0;
flagj =0;
for (int j=i;j<n-1;j++) {
// System.out.println("j="+j);
if (s.charAt(i)==s.charAt(j+1)) {
flag = 1;
flagj = 1;
m++;
// System.out.println("a "+flag+" "+flagj);
break;
}
}
if (flagj==0) {
//System.err.println("flagj");
for (int j=0;j<i;j++) {
// System.err.println("j="+j);
if (s.charAt(i)==s.charAt(j)) {
flag = 1;
m++;
// System.out.println("b "+flag);
break;
}
}
}
}
if (m==n) {
return true;
}else {
return false;
}
}
}
- 1、检测一个单词是否只是由重复的字母组成,就是说在这个单词里,每一种出现的字母至少要有两个。所以,可以设置一个检测,从第一个字母开始,分别与单词中的其他字母比较,当找到一个字母与之相同时,就可以停止比较,进行后一个字母的比较。
- 2、当要比较的这个字母为整个单词的首字母时,其只需和后面的单词做比较就好,同理得尾字母只需同前面字母比较。但是当一个字母在中间时,它需要和其前面部分和后面部分比较。因此需要设置不同的循环条件。同时,当其与后面部分比较发现相同字母时,不必要在于前面部分比较,所以可设置一个标志位flagj来判断还需不需要进行与其前面部分的比较。
- 3、整个单词中的每一个字母都需要进行一次主动比较,即主动与其他字母比较。比较的结果有两种,一种是找到相同,一种是没找到,分别对应了flag的两个数值。而采用m,这是一个计数器,记录了总共有多少个字母通过主动比较找到了相同字母。如果m等于单词长度,也就意味着这个单词中的每一个字母都至少出现了两次,也就满足题目。而m不等于单词长度,m只可能小于单词长度,表明这个单词中至少有一个字母是只出现一次的。