通用子字符串按字母顺序排列

时间:2018-11-22 13:59:38

标签: c

我正在尝试编写一个代码,该代码获取两个最大长度为1000个大写字符的字符串,然后如果存在多个最大长度的子字符串,则打印它们的最长公共子字符串BUT,输出必须是该子字符串-string按字母顺序排在第一位。 例: 输入:DEFTABC,DEFHABC 输出:ABC 这是我写的代码,但是该代码的问题是,对于上述输入,它给出的是“ DEF”而不是“ ABC”,请帮助我更正我的代码。

#include<stdio.h>
#include<string.h>
int chart[1002][1002];
void commonsubstring(char str1[],char str2[],int m,int n){
int len=0;
int row,col,i,j;
for(i=0;i<=m;i++){
    for(j=0;j<=n;j++){
        if(i==0 || j==0){
          chart[i][j]=0;
        }
        else if(str1[i-1]==str2[j-1]){
            chart[i][j]=chart[i-1][j-1]+1;
            if(len<chart[i][j]){
                len=chart[i][j];
                row=i;
                col=j;
            }
        }
        else{
            chart[i][j]=0;
        }
    }
}
if(len==0){
    return;
}
char result[1001];
while(chart[row][col]!=0){
    result[--len]=str1[row-1];
    row--;
    col--;
}
puts(result);
}
int main(){
char str1[1001],str2[1001];
gets(str1);
gets(str2);
int m,n;
m=strlen(str1);
n=strlen(str2);
commonsubstring(str1,str2,m,n);
return 0;
}

1 个答案:

答案 0 :(得分:0)

使用标准的字符串函数来减少代码的复杂度。如果由于某些原因private void run() throws Exception { Directory directory = new RAMDirectory(); IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new StandardAnalyzer()); IndexWriter writer = new IndexWriter(directory, indexWriterConfig); Document doc = new Document(); // Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.YES FieldType type = new FieldType(); type.setStoreTermVectors(true); type.setStoreTermVectorPositions(true); type.setStoreTermVectorOffsets(true); type.setIndexOptions(IndexOptions.DOCS); Field fieldStore = new Field("tags", "foo bar and then some", type); doc.add(fieldStore); writer.addDocument(doc); writer.close(); DirectoryReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); Term t = new Term("tags", "bar"); Query q = new TermQuery(t); TopDocs results = searcher.search(q, 1); for ( ScoreDoc scoreDoc: results.scoreDocs ) { Fields termVs = reader.getTermVectors(scoreDoc.doc); Terms f = termVs.terms("tags"); TermsEnum te = f.iterator(); PostingsEnum docsAndPosEnum = null; BytesRef bytesRef; while ( (bytesRef = te.next()) != null ) { docsAndPosEnum = te.postings(docsAndPosEnum, PostingsEnum.ALL); // for each term (iterator next) in this field (field) // iterate over the docs (should only be one) int nextDoc = docsAndPosEnum.nextDoc(); assert nextDoc != DocIdSetIterator.NO_MORE_DOCS; final int fr = docsAndPosEnum.freq(); final int p = docsAndPosEnum.nextPosition(); final int o = docsAndPosEnum.startOffset(); System.out.println("p="+ p + ", o=" + o + ", l=" + bytesRef.length + ", f=" + fr + ", s=" + bytesRef.utf8ToString()); } } } app.post('/sendMails', function(req,res) { console.log("WENT INTO SEND MAILS!!!") let transporter = nodemailer.createTransport({ service: 'gmail', secure: false, port: 25, auth: { user: 'someemail@gmail.com', pass: process.env.MAIL_PASSWORD }, tls: { rejectUnauthorized: false }, }); let HelperOptions = { from: '"Babababa" <someemail@gmail.com>', to: 'someemail@gmail.com', subject: 'Hello world', text: 'hey dude' }; transporter.sendMail(HelperOptions, (error, response) => { if(error) { console.log(error); return res.json({error: "API Error"}); // return should be here instead of at console.log } else{ console.log("The message is sent: " + response.message); return res.json({response: "sent"}) } }) });等不可用,则可以创建自己的函数。

您不需要1000个大小为1000的字符串数组。只需获取较短的字符串并找到其所有子字符串即可。如果在较大的字符串中找到了子字符串,则将其作为结果。如果结果已经存在,请确保新匹配项比现有结果长,并且按字母顺序排列。示例:

strcmp