当前位置: 代码迷 >> J2SE >> 字符串相干算法题。求最优算法
  详细解决方案

字符串相干算法题。求最优算法

热度:85   发布时间:2016-04-24 12:48:21.0
字符串相关算法题。求最优算法。
如何找出一个字符串中出现字符最多的,可能有多个出现最多的字符。
如何找出一个字符串中出现最多的前三个字符。
如果有三个字符出现次数超过字符串长度的1/4如何找出它们。



------解决方案--------------------
Java code
String str = "aglakjsflajfla;sfdjalsfjal;sjfdlasjfdljsafljasljflasfj";char [] strArray = str.toCharArray();int [] rs = new int[strArray.length * 2];int index = 0;for (int i = 0; i < strArray.length; i++){    char tmp1 = strArray[i];    if (c == 0)    {        continue;    }    rs[index++] = tmp1;    rs[index] = 1;    for (int j = i + 1; j < strArray.length; j++)    {        char tmp2 = strArray[j];        if (tmp2 == 0)        {            continue;        }        if (tmp1 == tmp2)        {            strArray[j] = 0;            rs[index]++;        }    }    index++;}int max1 = 0;int max2 = 0;int max3 = 0;int thePos1 = 0;int thePos2 = 0;int thePos3 = 0;for (int i = 0; i < index; i += 2){    if (rs[i] > max1)    {        max1 = rs[i];        thePos1 = i;    }}rs[thePos1] = -max1;for (int i = 0; i < index; i += 2){    if (rs[i] > max2)    {        max2 = rs[i];        thePos2 = i;    }}rs[thePos2] = -max2;for (int i = 0; i < index; i += 2){    if (rs[i] > max3)    {        max3 = rs[i];        thePos3 = i;    }}System.out.println("No1. " + (char)rs[thePos1 - 1] + ":" + max1);System.out.println("No2. " + (char)rs[thePos2 - 1] + ":" + max2);System.out.println("No3. " + (char)rs[thePos3 - 1] + ":" + max3);
------解决方案--------------------
String str = "aglakjsflajfla;sfdjalsfjal;sjfdlasjfdljsafljasljflasfj";
char[] strArray = str.toCharArray();

int[] charCount = new int[1000];
for(int i = 0; i < strArray.length; i++)
{
int value = (int)strArray[i];
charCount[value] += 1;
}

for(int i = 0; i < strArray.length; i++)
{
int value = (int)strArray[i];
System.out.print(strArray[i]);
System.out.print(":");
System.out.println(charCount[value]);
}

基本原理如下:遍历字符数组strArray,将字符转换成整数,如A就是65?97?。
然后用这样一个整数作为下标,将该字符出现的次数记录在整形数组charCount中,charCount[65]就是A出现的次数了。
和前面提到的hashtable原理差不多
------解决方案--------------------
唉....我也玩玩.....
import java.util.Comparator;
import java.util.TreeMap;
import java.util.TreeSet;

class Parent implements Comparator<String>{

@Override
public int compare(String o1, String o2) {
if(o1.equals(o2)){
return 0;
}else if(Integer.parseInt(o1.substring(0,o1.length()-1))>Integer.parseInt(o2.substring(0,o2.length()-1))){
return 1;
}
return -1;
}

}
public class Child {

public static void main(String[] args) {
int count;
String[] st;
String s = "shldg./asm'aoaayaaaypwy3u2.......0373902...tSk'al'f,askr[auirp0au2q6";
TreeSet<String> set = new TreeSet<String>(new Parent());
TreeMap<Character,Integer> map = new TreeMap<Character,Integer>();
for(char c:s.toCharArray()){
if(map.get(c) == null){
map.put(c, 1);
}else{
count = map.get(c)+1;
map.put(c, count);
}
}
for(Character c:map.keySet()){
set.add(""+map.get(c)+c);
}
st = set.toArray(new String[0]);
count = 0;
System.out.print("出现最多的字符:"+st[st.length-1].charAt(st[st.length-1].length()-1));
for(int i = st.length-2;i>=0;i--){
if(st[i].charAt(0) == st[i+1].charAt(0)){
System.out.print(" "+st[i].charAt(1));
}else{
break;
}
}
System.out.println();
  相关解决方案