2014-11-20 3 views
0

Мне было дано задание сделать программу, которая определяет количество уникальных палиндромов, которые являются подстроками. Уникальные палиндромы должны быть расположены по длине и в алфавитном порядке. Я смог определить подстрочные палиндромы, но я не могу понять, как их упорядочить в алфавитном порядке.Сортировщик подстроки Palindrome в C

Я забыл упомянуть, что мы должны использовать только stdio.h

Вот что его воображаемое будет, когда вы вводите «amadama»: В 6 уникальных палиндромов в «amadama» являются «а», 'd', 'm', 'ada', 'madam' и 'amadama'. , но моя программа делает это: 12 уникальных палиндромов в 'amadama' - это 'a', 'm', 'ama', 'a', 'd', 'ada', 'madam', 'amadama', ' а»,„м“,„ама“,„а“.

+0

Просто общее в программировании: избегайте функций длиной более 20 строк. Меньшие функции более читабельны более эффективными, легче отлаживаются и легче писать. – Antzi

ответ

1

Ваш список «предполагается как» не включает ama, несмотря на то, что он соответствует критериям. Вероятно, вам следует разъяснить это с воспитателем.

После уточнения следующего шага, который вам нужно предпринять, необходимо удалить дубликаты с вашего вывода. Ваш вывод на самом деле кажется правильным, но из-за того, что он все еще имеет дублированные значения, поэтому я бы начал с того, что у вас есть.

Учитывая, что это классная работа, я не дам вам полное решение, но я будет сказать, что один вариант, чтобы отсортировать слова (например, с qsort), а затем выводить их таким образом, что дубликаты удаляются.

Следующий псевдокод является одним из способов сделать это с отсортированного массива:

output word[0] 
for index = 1 to word.numelements - 1: 
    if word[index] != word[index - 1]: 
     output word[index] 

Если у вас есть проблемы получать qsort вести себя, как вы ожидали (и многие из них), еще один вариант, чтобы просто удалить дубликатами с чем-то вроде:

for index1 = 0 to word.numelements - 2: 
    for index2 = index1 + 1 to word.numelements - 1: 
     if word[index1] == word[index2]: 
      word[index2] = "" 

и затем выводит те, которые не были установлены в пустую строку:

for index = 0 to word.numelements - 1: 
    if word[index] != "": 
     output word[index] 

Обратите внимание, что я оставляю это до вас, чтобы перевести этот псевдо-код в C, но вы должны помнить несколько вещей:

  • Сравнение строк должно быть сделано с strcmp(), а не == и != ,
  • Вы можете установить, чтобы строки были пустыми, просто установив свой первый символ в байт NUL: str[0] = '\0'.
  • Вы можете проверить, является ли строка пустой, используя strlen(), или путем проверки первого символа установлен в NUL-байт.
+0

Да, я уточнил, что это уже должно было быть распечатано! Спасибо –

+0

Как мне закодировать его таким образом, что мне не понадобится использовать функцию strlen()? Нам не разрешено использовать другие библиотеки, кроме stdio –

+0

@Neil, 'if (strlen (s) == 0)' можно сделать с помощью 'if (s [0] == '\ 0')'.'strcmp()' немного сложнее, возможно, проще реализовать свой собственный с помощью чего-то вроде: 'int mystrcmp (unsigned char * s1, unsigned char * s2) {for (;;) {if (* s1 <* s2) return -1; if (* s1> * s2) return 1; if (* s1 == '\ 0') break; s1 ++; s2 ++; } return 0; } '. – paxdiablo